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
、