KNN回归在无线定位上的应用

KNN回归在无线定位上的应用

Python KNN 无线定位 回归

1.KNN无线指纹定位代码

#coding:utf-8
import random
import math

# 提取训练集与测试集数据
def extracted_data():
    trainingSet=[]
    label=[]
    testSet=[]
    test_label=[] 

    file_1=open("train1.csv","r")
    for line in file_1:
        data=line.split(",")
        train_label=[float(i) for i in data[-2:]]
        train_features=[float(i) for i in data[0:-2]] #该数据为已经处理过的数据
        trainingSet.append(train_features) 
        label.append(train_label)
    file_1.close()

    file_2=open("test1.csv","r")
    for line in file_2:
        data=line.split(",")
        testlabel=[float(i) for i in data[-2:]]
        testfeatures=[float(i) for i in data[0:-2]] #该数据为已经处理过的数据
        testSet.append(testfeatures) 
        test_label.append(testlabel)
    file_2.close()

    print'len train:',len(trainingSet),'len test:',len(testSet)
    print'len train1:',len(trainingSet[0]),'len test1:',len(test_label[0])

    return trainingSet,label,testSet,test_label


def euclideanDistance(instance1, instance2, length):
    distance = 0
    #对应AP作差  
    for x in range(length):
        distance += pow(float(instance1[x] - instance2[x]), 2)
    return math.sqrt(distance)


#求出最近的几个邻居点
def Neighbors(trainingSet, testInstance, k):
    distances = []
    label_ID=[]
   #生成训练数据集个数的序号label_ID=0,1,2,3,4,5,6,7.。。。。。。。
    for ii in range(len(trainingSet)):
      label_ID.append(ii)

    length = len(testInstance)-1  #此处的length是代表函数 euclideanDistance内部的pow(float(instance1[x] - instance2[x])数组标号x,

    #遍历testInstance与trainingSet每个案例的欧式距离,所得距离值存入distances
    for x in range(len(trainingSet)):
        dist = euclideanDistance(testInstance, trainingSet[x], length)
        distances.append(dist)

  #  for i in range(len(trainingSet)):
  #    print("distance: ",distances[i],"labelID",label_ID[i],"i",i)


    #对distances进行冒泡升值排序,同时把对应的序号label_ID进行相应排序(训练集的顺序 是 固定的)
    for ii in range(len(trainingSet)-1):
      for jj in range(len(trainingSet)-ii-1):
        if distances[jj]>distances[jj+1]:
           distances[jj],distances[jj+1]=distances[jj+1],distances[jj]
           label_ID[jj],label_ID[jj+1]=label_ID[jj+1],label_ID[jj]


    #将最近的k个邻居样本存下来,上面的代码已经进行了排序因此最近的 就是 最前面的k个
    neighbors = []
    for x in range(k):
        neighbors.append(label_ID[x])
    return neighbors

def Result(neighbors,label):
    length=len(neighbors)
    result_x=0
    result_y=0

    for i in range(length):
        result_x=result_x+label[neighbors[i]][0]
        result_y=result_y+label[neighbors[i]][1]
       # print("neb;",neighbors[i],"label:",label[neighbors[i]])
    result_x=result_x/length
    result_y=result_y/length
    return result_x,result_y

def Accuracy(predictions_x,predictions_y,test_label):
    accuracy=0.0
    for i in range(len(predictions_x)):
           accuracy+=math.sqrt(float((predictions_x[i]-test_label[i][0])**2)+float((predictions_y[i]-test_label[i][1])**2))
  #  print 'accuracy',accuracy/len(predictions_x)
    return accuracy/len(predictions_x)



if __name__=='__main__':

    trainingSet,label,testSet,test_label=extracted_data()

    predictions_x=[]
    predictions_y=[]
    k = 3
    for x in range(len(testSet)):
        neighbors = Neighbors(trainingSet, testSet[x], k)
        result_x,result_y=Result(neighbors,label)
       # print"result_x: ",result_x,"result_y:",result_y
        predictions_x.append(result_x)
        predictions_y.append(result_y)

        accuracy = Accuracy(predictions_x,predictions_y,test_label)
        print"x",x,"  accuracy:",accuracy,"result_x: ",result_x,"result_y:",result_y


猜你喜欢

转载自blog.csdn.net/ML_SDD/article/details/77018062