室内定位——位置指纹法(KNN、WKNN)

一、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
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值