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

来源:互联网 发布:樱井知香喷泉 编辑:程序博客网 时间:2024/06/05 16:44

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

Python KNN 无线定位 回归

1.KNN无线指纹定位代码

#coding:utf-8import randomimport 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_labeldef 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 neighborsdef 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_ydef 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

阅读全文
0 0
原创粉丝点击