日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

位置指纹法的实现(KNN)

發布時間:2023/11/30 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 位置指纹法的实现(KNN) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


基本原理

位置指紋法可以看作是分類或回歸問題(特征是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, weights='uniform', metric='euclidean') 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_neighbors=40, weights='uniform', metric='euclidean') 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(weights='uniform', metric='euclidean') 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', linewidth=2.0) plt.xlabel("k") plt.ylabel("score") plt.grid(True) plt.show()

# 使用最優的k做knn回歸 knn_reg = neighbors.KNeighborsRegressor(n_neighbors=k, weights='uniform', metric='euclidean') 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_neighbors=k, weights='uniform', metric='euclidean')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', linewidth=2.0) plt.xlabel("data number") plt.ylabel("accuracy (m)") plt.grid(True) plt.show()



作者:rubbninja
出處:http://www.cnblogs.com/rubbninja/
關于作者:目前主要研究領域為機器學習與無線定位技術,歡迎討論與指正!
版權聲明:本文版權歸作者和博客園共有,轉載請注明出處。

總結

以上是生活随笔為你收集整理的位置指纹法的实现(KNN)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。