新氧整形网站开发模版,还有哪些网站可以做淘宝活动吗,wordpress瀑布流主题怎么设置首页显示文章数量,wordpress模板在哪里买基本原理 位置指纹法可以看作是分类或回归问题#xff08;特征是RSS向量#xff0c;标签是位置#xff09;#xff0c;监督式机器学习方法可以从数据中训练出一个从特征到标签的映射关系模型。kNN是一种很简单的监督式机器学习算法#xff0c;可以用来做分类或回归。 对于… 基本原理 位置指纹法可以看作是分类或回归问题特征是RSS向量标签是位置监督式机器学习方法可以从数据中训练出一个从特征到标签的映射关系模型。kNN是一种很简单的监督式机器学习算法可以用来做分类或回归。 对于在线RSS向量ss分别计算它与指纹库中各个RSS向量{s1,s2,...,sMs1,s2,...,sM}的距离比如欧氏距离选取最近的kk个位置指纹一个指纹是一个RSS向量与一个位置的对应。 对于knn回归标签是坐标x和坐标y可以进行数值计算使用这k个指纹的位置坐标取平均得到作为定位结果。 对于knn分类将定位区域划分为1m××1m的网格每个网格是看作一个类别用网格标号代替对k个网格标号计数投票选择票数做多的网格作为定位结果。 kNN是一种lazy式的学习方法在上面的过程中不需要使用训练数据进行“学习”在定位的时候直接在训练数据中搜索就可以。一些工具包中的kNN算法的训练过程中会建立一个kd树一种数据结构有利于在线预测时的搜索。 具体实现 Github地址包括matlab版本和python版本 数据来源说明http://www.cnblogs.com/rubbninja/p/6118430.html 导入数据 # 导入数据
import numpy as np
import scipy.io as scio
offline_data scio.loadmat(offline_data_random.mat)
online_data scio.loadmat(online_data.mat)
offline_location, offline_rss offline_data[offline_location], offline_data[offline_rss]
trace, rss online_data[trace][0:1000, :], online_data[rss][0:1000, :]
del offline_data
del online_data # 定位准确度
def accuracy(predictions, labels):return np.mean(np.sqrt(np.sum((predictions - labels)**2, 1))) knn回归 # knn回归
from sklearn import neighbors
knn_reg neighbors.KNeighborsRegressor(40, weightsuniform, metriceuclidean)
predictions knn_reg.fit(offline_rss, offline_location).predict(rss)
acc accuracy(predictions, trace)
print accuracy: , acc/100, m accuracy: 2.24421479398 m knn分类 # knn分类需要把坐标转换成网格标号预测后将网格标号转换为坐标
labels np.round(offline_location[:, 0]/100.0) * 100 np.round(offline_location[:, 1]/100.0)
from sklearn import neighbors
knn_cls neighbors.KNeighborsClassifier(n_neighbors40, weightsuniform, metriceuclidean)
predict_labels knn_cls.fit(offline_rss, labels).predict(rss)
x np.floor(predict_labels/100.0)
y predict_labels - x * 100
predictions np.column_stack((x, y)) * 100
acc accuracy(predictions, trace)
print accuracy: , acc/100, m accuracy: 2.73213398632 m 定位算法分析 加入数据预处理和交叉验证 # 预处理标准化数据(其实RSS数据还算正常不预处理应该也无所谓特征选择什么的也都不需要)
from sklearn.preprocessing import StandardScaler
standard_scaler StandardScaler().fit(offline_rss)
X_train standard_scaler.transform(offline_rss)
Y_train offline_location
X_test standard_scaler.transform(rss)
Y_test trace # 交叉验证在knn里用来选择最优的超参数k
from sklearn.model_selection import GridSearchCV
from sklearn import neighbors
parameters {n_neighbors:range(1, 50)}
knn_reg neighbors.KNeighborsRegressor(weightsuniform, metriceuclidean)
clf GridSearchCV(knn_reg, parameters)
clf.fit(offline_rss, offline_location)
scores clf.cv_results_[mean_test_score]
k np.argmax(scores) #选择score最大的k # 绘制超参数k与score的关系曲线
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(range(1, scores.shape[0] 1), scores, -o, linewidth2.0)
plt.xlabel(k)
plt.ylabel(score)
plt.grid(True)
plt.show() # 使用最优的k做knn回归
knn_reg neighbors.KNeighborsRegressor(n_neighborsk, weightsuniform, metriceuclidean)
predictions knn_reg.fit(offline_rss, offline_location).predict(rss)
acc accuracy(predictions, trace)
print accuracy: , acc/100, m accuracy: 2.22455511073 m # 训练数据量与accuracy
k 29
data_num range(100, 30000, 300)
acc []
for i in data_num:knn_reg neighbors.KNeighborsRegressor(n_neighborsk, weightsuniform, metriceuclidean)predictions knn_reg.fit(offline_rss[:i, :], offline_location[:i, :]).predict(rss)acc.append(accuracy(predictions, trace) / 100) # 绘制训练数据量与accuracy的曲线
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(data_num, acc, -o, linewidth2.0)
plt.xlabel(data number)
plt.ylabel(accuracy (m))
plt.grid(True)
plt.show() 作者rubbninja 出处http://www.cnblogs.com/rubbninja/ 关于作者目前主要研究领域为机器学习与无线定位技术欢迎讨论与指正 版权声明本文版权归作者和博客园共有转载请注明出处。