位置指紋法的實現(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()

png

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

png



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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387275.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

室內定位系列 ——WiFi位置指紋(譯)

摘要 GPS難以解決室內環境下的一些定位問題,大部分室內環境下都存在WiFi,因此利用WiFi進行定位無需額外部署硬件設備,是一個非常節省成本的方法。然而WiFi并不是專門為定位而設計的,傳統的基于時間和角度的定位方法并不適用于WiFi…

機器學習02線性回歸、多項式回歸、正規方程

單變量線性回歸(Linear Regression with One Variable) 預測器表達式: 選擇合適的參數(parameters)θ0 和 θ1,其決定了直線相對于訓練集的準確程度。 建模誤差(modeling error)&a…

最大乘積

給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間復雜度:O(n),空間復雜度:O(1) def solve():n input()a input().split()for i in range(len(a)):a[i] in…

機器學習03Logistic回歸

邏輯回歸 (Logistic Regression) 目前最流行,使用最廣泛的一種學習算法。 分類問題,要預測的變量 y 是離散的值。 邏輯回歸算法的性質是:它的輸出值永遠在 0 到 1 之間。 邏輯回歸模型的假設是: 其中&a…

基礎架構系列匯總

為了方便查找,把基礎架構系統文章按時間正序整理了一下,記錄如下: 1. 基礎架構之日志管理平臺搭建及java&net使用 2. 基礎架構之日志管理平臺及釘釘&郵件告警通知 3. 基礎架構之分布式配置中心 4. 基礎架構之分布式任務平臺 5. 基礎架…

CNN理解比較好的文章

什么是卷積神經網絡?為什么它們很重要? 卷積神經網絡(ConvNets 或者 CNNs)屬于神經網絡的范疇,已經在諸如圖像識別和分類的領域證明了其高效的能力。卷積神經網絡可以成功識別人臉、物體和交通信號,從而為機…

Windows 安裝Angular CLI

1、安裝nvm npm cnpm nrm(onenote筆記上有記錄) 參考:https://blog.csdn.net/tyro_java/article/details/51232458 提示:如果發現配置完后,出現類似“npm不是內部命令……”等信息。 可采取如下措施進行解決—— 檢查環…

機器學習04正則化

正則化(Regularization) 過擬合問題(Overfitting): 如果有非常多的特征,通過學習得到的假設可能能夠非常好地適應訓練集 :代價函數可能幾乎為 0), 但是可能會不能推廣到…

Adaboost算法

概述 一句話概述Adaboost算法的話就是:把多個簡單的分類器結合起來形成個復雜的分類器。也就是“三個臭皮匠頂一個諸葛亮”的道理。 可能僅看上面這句話還沒什么概念,那下面我引用個例子。 如下圖所示: 在D1這個數據集中有兩類數據“”和“-”…

Codeforces 408D Long Path (DP)

題目: One day, little Vasya found himself in a maze consisting of (n??1) rooms, numbered from 1 to (n??1). Initially, Vasya is at the first room and to get out of the maze, he needs to get to the (n??1)-th one. The maze is organized as fol…

機器學習05神經網絡--表示

神經網絡:表示(Neural Networks: Representation) 如今的神經網絡對于許多應用來說是最先進的技術。 對于現代機器學習應用,它是最有效的技術方法。 神經網絡模型是許多邏輯單元按照不同層級組織起來的網絡, 每一層…

邏輯回歸(Logistic Regression, LR)又稱為邏輯回歸分析,是分類和預測算法中的一種。通過歷史數據的表現對未來結果發生的概率進行預測。例如,我們可以將購買的概率設置為因變量,將用戶的

邏輯回歸(Logistic Regression, LR)又稱為邏輯回歸分析,是分類和預測算法中的一種。通過歷史數據的表現對未來結果發生的概率進行預測。例如,我們可以將購買的概率設置為因變量,將用戶的特征屬性,例如性別,年齡&#x…

解決SecureCRT無法用非root賬號登錄ssh

鏈接失敗,提示這個: --------------------------- SecureCRT --------------------------- 連接到會話 192.168.1.100 失敗 : The server has disconnected with an error. Server message reads: A protocol error occurred. Change of username or se…

機器學習06神經網絡--學習

代價函數 標記方法: 神經網絡的訓練樣本有 m 個 每個包含一組輸入 x 和一組輸出信號 y L 表示神經網絡層數 Sl表示每層的 neuron 個數(SL 表示輸出層神經元個數) 將神經網絡的分類定義為兩種情況: 二類分類:SL1, y0 or 1 表示哪一類&…

Logistic Regression Classifier邏輯回歸

Logistic Regression Classifier邏輯回歸主要思想就是用最大似然概率方法構建出方程,為最大化方程,利用牛頓梯度上升求解方程參數。 優點:計算代價不高,易于理解和實現。缺點:容易欠擬合,分類精度可能不高…

機器學習07應用機器學習的建議

決定下一步做什么(Deciding What to Try Next) 確保在設計機器學習系統時,能夠選擇一條最合適、最正確的道路。 具體來講,將重點關注的問題是:假如你在開發一個機器學習系統,或者想試著改進一個機器學習…

CSS3--5.顏色屬性

HTML5中添加了一些新的顏色的表示方式 1.RGBA:說得簡單一點就是在RGB的基礎上加進了一個通道Alpha。RGBA在RGB的基礎上多了控制alpha透明度的參數。以上R、G、B三個參數,正整數值的取值范圍為:0 - 255。百分數值的取值范圍為:0.0%…

邏輯回歸的通俗解釋 邏輯回歸的定位

1 邏輯回歸的定位 首先,邏輯回歸是一種分類(Classification)算法。比如說: 給定一封郵件,判斷是不是垃圾郵件給出一個交易明細數據,判斷這個交易是否是欺詐交易給出一個腫瘤檢查的結果數據,判斷…

機器學習08機器學習系統設計

首先要做什么 一個垃圾郵件分類器算法為例: 為了解決這樣一個問題,首先要做的決定是如何選擇并表達特征向量 x。 可以選擇一個由 100 個最常出現在垃圾郵件中的詞所構成的列表,根據這些詞是否有在郵件中 出現,來獲得我們的特…

數學筆記1——導數1(導數的基本概念)

什么是導數導數是高數中的重要概念,被應用于多種學科。從物理意義上講,導數就是求解變化率的問題;從幾何意義上講,導數就是求函數在某一點上的切線的斜率。我們熟知的速度公式:v s/t,這求解的是平均速度&a…