室內定位系列(三) 位置指紋法的實現(KNN)

2022-07-12 11:24:10 字數 4145 閱讀 1912

位置指紋法中最常用的演算法是k最近鄰(knn):選取與當前rss最鄰近的k個指紋的位置估計當前位置,簡單直觀有效。本文介紹knn用於定位的基本原理與具體實現(matlab、python)。

位置指紋法可以看作是分類或回歸問題(特徵是rss向量,標籤是位置),監督式機器學習方法可以從資料中訓練出乙個從特徵到標籤的對映關係模型。knn是一種很簡單的監督式機器學習演算法,可以用來做分類或回歸。

github位址,包括matlab版本和python版本

資料**說明:

匯入資料

# 匯入資料

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 =

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的關係曲線

# 使用最優的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)

# 繪製訓練資料量與accuracy的曲線

出處:[

shell 三 位置引數

執行 shell 指令碼檔案時我們可以給它傳遞一些引數,這些引數在指令碼檔案內部可以使用 n的形式來接收,例如,1 表示第乙個引數,2 表示第二個引數,依次類推 在講解變數的命名時,我們提到 變數的名字必須以字母或者下劃線開頭,不能以數字開頭 但是位置引數卻偏偏是數字,這和變數的命名規則是相悖的,所...

1 室內定位 三邊定位

一 藍芽簡介 1 智慧型手機一般都配備ble低功耗藍芽模組。藍芽工作在2.4ghz頻段。共有四種連線模式 活躍 呼吸 保持 休眠,功耗依次減少。自適應發射功率控制 從裝置檢測接收訊號強度時,值小於最低閾值,請求主控裝置增大發射功率。2 藍芽協議體系 1 底層模組 鏈路管理層 基帶層 藍芽射頻 2 中...

正規表示式總結(三) 位置

一句話 只斷言 判斷 位置,不去匹配,只定位就像 exp exp2 exp3 匹配以exp開始,以exp3結束的exp2部份。比如 b w ing b 匹配以ing結尾的單詞的前面部分 除了ing以外的部分 零寬斷言 何為斷言 斷言某個位置會出現,或不會出現某個模式,但不去匹配這個模式。當斷言不成功...