一、KNN算法
位置指纹法中最常用的算法是k最近邻(kNN):选取与当前RSS最邻近的k个指纹的位置估计当前位置,简单直观有效。
基本原理
位置指纹法可以看作是分类或回归问题(特征是RSS向量,标签是位置),监督式机器学习方法可以从数据中训练出一个从特征到标签的映射关系模型。kNN是一种很简单的监督式机器学习算法,可以用来做分类或回归。
对于在线RSS向量,分别计算它与指纹库中各个RSS向量之间的距离(比如欧氏距离),选取最近的k个位置指纹(一个指纹是一个RSS向量与一个位置的对应)。
-
对于knn回归,标签是坐标x和坐标y,可以进行数值计算,使用这k个指纹的位置坐标取平均,得到作为定位结果。
-
对于knn分类,将定位区域划分为1m××1m的网格,每个网格是看作一个类别,用网格标号代替,对k个网格标号计数投票,选择票数做多的网格作为定位结果。
kNN是一种lazy式的学习方法,在上面的过程中不需要使用训练数据进行“学习”,在定位的时候直接在训练数据中搜索就可以。一些工具包中的kNN算法的训练过程中会建立一个kd树(一种数据结构),有利于在线预测时的搜索。
具体实现(python)
回归(RSS向量+坐标):
import numpy as np
import time
start_time = time.time()
## 准备数据
train_data = train_arr3[:,0:(train_arr3.shape[1]-2)]
train_crd = train_arr3[:,(train_arr3.shape[1]-2):train_arr3.shape[1]]
test_data = test_arr3[:,0:(test_arr3.shape[1]-2)]
test_crd = test_arr3[:,(test_arr3.shape[1]-2):test_arr3.shape[1]]
## 2.定义准确度函数
def getAccuracy(pred_crd,test_crd):
return np.mean(np.sqrt(np.sum((pred_crd-test_crd)**2,1)))
## 3.导入KNN模块
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor(4, weights='uniform', metric='euclidean')
%time knn