1. 程式人生 > >室內定位系列(四)——位置指紋法的實現(測試各種機器學習分類器)

室內定位系列(四)——位置指紋法的實現(測試各種機器學習分類器)

位置指紋法中最常用的演算法是k最近鄰(kNN)。本文的目的學習一下python機器學習scikit-learn的使用,嘗試了各種常見的機器學習分類器,比較它們在位置指紋法中的定位效果。

匯入資料

# 匯入資料
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')
%time knn_reg.fit(offline_rss, offline_location)
%time predictions = knn_reg.predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, "m"
Wall time: 92 ms
Wall time: 182 ms
accuracy:  2.24421479398 m

Logistic regression (邏輯斯蒂迴歸)

# 邏輯斯蒂迴歸是用來分類的
labels = np.round(offline_location[:, 0]/100.0) * 100 + np.round(offline_location[:, 1]/100.0)
from sklearn.linear_model import LogisticRegressionCV
clf_l2_LR_cv = LogisticRegressionCV(Cs=20, penalty='l2', tol=0.001)
predict_labels = clf_l2_LR.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:  3.08581348591 m

Support Vector Machine for Regression (支援向量機)

from sklearn import svm
clf_x = svm.SVR(C=1000, gamma=0.01)
clf_y = svm.SVR(C=1000, gamma=0.01)
%time clf_x.fit(offline_rss, offline_location[:, 0])
%time clf_y.fit(offline_rss, offline_location[:, 1])
%time x = clf_x.predict(rss)
%time y = clf_y.predict(rss)
predictions = np.column_stack((x, y))
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, "m"
Wall time: 9min 27s
Wall time: 12min 42s
Wall time: 1.06 s
Wall time: 1.05 s
accuracy:  2.2468400825 m

Support Vector Machine for Classification (支援向量機)

from sklearn import svm
labels = np.round(offline_location[:, 0]/100.0) * 100 + np.round(offline_location[:, 1]/100.0)
clf_svc = svm.SVC(C=1000, tol=0.01, gamma=0.001)
%time clf_svc.fit(offline_rss, labels)
%time predict_labels = clf_svc.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'
Wall time: 1min 16s
Wall time: 15 s
accuracy:  2.50931890608 m

random forest regressor (隨機森林)

from sklearn.ensemble import RandomForestRegressor
estimator = RandomForestRegressor(n_estimators=150)
%time estimator.fit(offline_rss, offline_location)
%time predictions = estimator.predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, 'm'
Wall time: 58.6 s
Wall time: 196 ms
accuracy:  2.20778352008 m

random forest classifier (隨機森林)

from sklearn.ensemble import RandomForestClassifier
labels = np.round(offline_location[:, 0]/100.0) * 100 + np.round(offline_location[:, 1]/100.0)
estimator = RandomForestClassifier(n_estimators=20, max_features=None, max_depth=20) # 記憶體受限,tree的數量有點少
%time estimator.fit(offline_rss, labels)
%time predict_labels = estimator.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'
Wall time: 39.6 s
Wall time: 113 ms
accuracy:  2.56860790666 m

Linear Regression (線性迴歸)

from sklearn.linear_model import LinearRegression
predictions = LinearRegression().fit(offline_rss, offline_location).predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, 'm'
accuracy:  3.83239841667 m

Ridge Regression (嶺迴歸)

from sklearn.linear_model import RidgeCV
clf = RidgeCV(alphas=np.logspace(-4, 4, 10))
predictions = clf.fit(offline_rss, offline_location).predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, 'm'
accuracy:  3.83255676918 m

Lasso迴歸

from sklearn.linear_model import MultiTaskLassoCV
clf = MultiTaskLassoCV(alphas=np.logspace(-4, 4, 10))
predictions = clf.fit(offline_rss, offline_location).predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, 'm'
accuracy:  3.83244688001 m

Elastic Net (彈性網迴歸)

from sklearn.linear_model import MultiTaskElasticNetCV
clf = MultiTaskElasticNetCV(alphas=np.logspace(-4, 4, 10))
predictions = clf.fit(offline_rss, offline_location).predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, 'm'
accuracy:  3.832486036 m

Bayesian Ridge Regression (貝葉斯嶺迴歸)

from sklearn.linear_model import BayesianRidge
from sklearn.multioutput import MultiOutputRegressor
clf = MultiOutputRegressor(BayesianRidge())
predictions = clf.fit(offline_rss, offline_location).predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, "m"
accuracy:  3.83243319129 m

Gradient Boosting for regression (梯度提升)

from sklearn import ensemble
from sklearn.multioutput import MultiOutputRegressor
clf = MultiOutputRegressor(ensemble.GradientBoostingRegressor(n_estimators=100, max_depth=10))
%time clf.fit(offline_rss, offline_location)
%time predictions = clf.predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, "m"
Wall time: 43.4 s
Wall time: 17 ms
accuracy:  2.22100945095 m

Multi-layer Perceptron regressor (神經網路多層感知器)

from sklearn.neural_network import MLPRegressor
clf = MLPRegressor(hidden_layer_sizes=(100, 100))
%time clf.fit(offline_rss, offline_location)
%time predictions = clf.predict(rss)
acc = accuracy(predictions, trace)
print "accuracy: ", acc/100, "m"
Wall time: 1min 1s
Wall time: 6 ms
accuracy:  2.4517504109 m

總結

上面的幾個線性迴歸模型顯然效果太差,這裡彙總一下其他的一些迴歸模型:

演算法 定位精度
knn 2.24m
logistic regression 3.09m
support vector machine 2.25m
random forest 2.21m
Gradient Boosting for regression 2.22m
Multi-layer Perceptron regressor 2.45m

從大致的定位精度上看,KNN、SVM、RF、GBDT這四個模型比較好(上面很多演算法並沒有仔細地調引數,這個結果也比較粗略,神經網路完全不知道怎麼去調...)。此外要注意的是,SVM訓練速度慢,調參太麻煩,KNN進行預測時的時間複雜度應該是和訓練資料量成正比的,從定位的實時性上應該不如RF和GBDT。



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

相關推薦

室內定位系列——位置指紋實現測試各種機器學習分類

位置指紋法中最常用的演算法是k最近鄰(kNN)。本文的目的學習一下python機器學習scikit-learn的使用,嘗試了各種常見的機器學習分類器,比較它們在位置指紋法中的定位效果。 匯入資料 # 匯入資料 import numpy as np import scipy.io as scio offl

室內定位系列——位置指紋實現KNN

位置指紋法中最常用的演算法是k最近鄰(kNN):選取與當前RSS最鄰近的k個指紋的位置估計當前位置,簡單直觀有效。本文介紹kNN用於定位的基本原理與具體實現(matlab、python)。 基本原理 位置指紋法可以看作是分類或迴歸問題(特徵是RSS向量,標籤是位置),監督式機器學習方法可以從資料中訓練出一

室內定位系列——WiFi位置指紋

目錄 摘要 GPS難以解決室內環境下的一些定位問題,大部分室內環境下都存在WiFi,因此利用WiFi進行定位無需額外部署硬體裝置,是一個非常節省成本的方法。然而WiFi並不是專門為定位而設計的,傳統的基於時間和角度的定位方法並不適用於WiFi。近十年來,在室內WiFi場景下的定位中,位置指紋法被廣泛研究

室內定位系列——目標跟蹤粒子濾波

進行目標跟蹤時,先驗知識告訴我們定位軌跡是平滑的,目標當前時刻的狀態與上一時刻的狀態有關,濾波方法可以將這些先驗知識考慮進來得到更準確的定位軌跡。本文簡單介紹粒子濾波及其使用,接著卡爾曼濾波寫,建議先閱讀室內定位系列(五)——目標跟蹤(卡爾曼濾波)。 原理 這裡跟卡爾曼濾波進行對比來理解粒子濾波。 目標

室內定位系列——模擬獲取RSS資料

很多情況下大家都採用實際測量的資料進行定位演算法的效能分析和驗證,但是實際測量的工作量太大、資料不全面、靈活性較小,採用模擬的方法獲取RSS資料是另一種可供選擇的方式。本文介紹射線跟蹤技術的基本原理,以及如何得到用於定位模擬的RSS資料。在此基礎上得到位置指紋庫與一組測試資料,用於以後定位演算法的驗證。(本

室內定位系列——目標跟蹤卡爾曼濾波

進行目標跟蹤時,先驗知識告訴我們定位軌跡是平滑的,目標當前時刻的狀態與上一時刻的狀態有關,濾波方法可以將這些先驗知識考慮進來得到更準確的定位軌跡。本文簡單介紹卡爾曼濾波及其使用。 原理 這裡僅從目標定位跟蹤的角度做一個簡化版的介紹。 定位跟蹤時,可以通過某種定位技術(比如位置指紋法)得到一個位置估計(

Andrew Ng機器學習筆記+Weka相關算實現SVM和原始對偶問題

優化問題 坐標 出了 變量 addclass fun ber 找到 線性 這篇博客主要解說了Ng的課第六、七個視頻,涉及到的內容包含,函數間隔和幾何間隔、最優間隔分類器 ( Optimal Margin Classifier)、原始/對偶問題 ( Pr

充值系列——充值系統業務邏輯層實現

上一篇文章主要說明充值的執行邏輯和控制層的設計,這篇文章主要討論充值業務層的具體實現。 正如上一篇文章所說到的,生成訂單需要如下幾個步驟: (1)例項化操作人 (操作人) (2)例項化產品模型 (獲取產品的詳細資訊) (3)例項化訂單模型 (生成一筆狀態為“交易中”的訂單)

【POJ - 2533】Longest Ordered Subsequence種方法解決最長上升子序列 含二分優化版本

題幹: Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Acc

機器學習系列之K-近鄰演算法監督學習-分類問題

''' @description : 演算法優點: a簡單、易於理解、易於實現、無需估計引數、無需訓練 演算法缺點: a懶惰演算法,對測試樣本分類時計算量大,記憶體開銷大 b必須制定k值,k值得選擇

皇后問題的程式碼實現java

/***  * 求解四皇后問題(回溯法)  * @author user  *  */ public class hjk {     private int[][] s = new int[4][4];   

快速排序Java隨機位置快排實現

package cn.edu.nwsuaf.cie.qhs; import java.util.Random; import java.util.Scanner; // public class QuickSort {     private int initArray[];     public i

機器學習系列之樸素貝葉斯演算法監督學習-分類問題

''' @description :一級分類:監督學習,二級分類:分類(離散問題),三級分類:貝葉斯演算法 演算法優點: a 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率 b 對缺失的資料不太敏感,演算法也比較簡

Regularized least-squares classification正則化最小二乘法分類取代SVM

得出 ack 提高 kernel sys 風險 重要 ref height 在機器學習或者是模式識別其中有一種重要的分類器叫做:SVM 。這個被廣泛的應用於各個領域。可是其計算的復雜度以及訓練的速度是制約其在實時的計算機應用的主要原因。因此也非常非常多的算法

HDU 2586 How far away ?LCA在線算實現

計算 algo size vector tar urn target nbsp struct http://acm.hdu.edu.cn/showproblem.php?pid=2586 題意:給出一棵樹,求出樹上任意兩點之間的距離。 思路: 這道題可以利用LC

斯坦福大學公開課機器學習:Neural Networks,representation: non-linear hypotheses為什麽需要做非線性分類

繼續 例子 產生 成本 log repr 概率 .cn 成了 如上圖所示,如果用邏輯回歸來解決這個問題,首先需要構造一個包含很多非線性項的邏輯回歸函數g(x)。這裏g仍是s型函數(即 )。我們能讓函數包含很多像這的多項式,當多項式足夠多時,那麽你也許能夠得到可以

系統環境變量就是不需要切換目錄,敲擊“python”就可以進入編碼

就是 切換目錄 bubuko 新建 pytho alt pat 系統設置 分享圖片 1.右擊我的電腦,選擇屬性,選擇“高級系統設置” 2.選擇高級,選擇環境變量 3.在系統變量中找到path,點擊編輯。然後新建,將python的路徑復制進去,點擊確定。 系統環境變量

Android項目實戰十六:QQ空間實現—— 展示說說中的評論內容並有相應點擊事件

con toast short demo append 集合 obj parent 自帶 原文:Android項目實戰(十六):QQ空間實現(一)—— 展示說說中的評論內容並有相應點擊事件大家都玩QQ空間客戶端,對於每一個說說,我們都可以評論,那麽,對於某一條評論:

SPOJ ADAFIELD Ada and FieldSTL的使用:set,multiset,map的叠代題解

tdi 重復 pan eat iterator %d seed class ... 題意:n*m的方格,“0 x”表示x軸在x位置切一刀,“0 y”表示y軸在y位置切一刀,每次操作後輸出當前面積最大矩形。 思路:用set分別儲存x軸y軸分割的點,用multiset(可重復)

Algorand算實現

span agreement 科學 anti 文章 技術 給定 節點 雲上 判斷節點是potential leader的條件: H(Sig(r, 1, Br-1)) <= 1 / size(PKr-k) size(PKr-k)為第r-k輪中網絡中參與區塊共識的