資源簡介
精簡的knn定位算法,包含數據集,可直接運行

代碼片段和文件信息
load(‘data‘);
%%?數據說明
%fingerprint_sim:???指紋數據庫20m*15m?6AP
%RSS_fp:????100組測試數據的RSS
%p_true:????100組測試數據的真實位置
%%?KNN算法
n?=?6;%使用AP的數目,這里使用全部6個(<=n_AP)
k?=?4;%KNN算法中的K,隨便調一調大小,關系不大
p_KNN?=?0;%存定位結果
for?i=1:size(p_true);???%按順序分別給每一個數據定位
????[size_x?size_y?n_AP]?=?size(fingerprint_sim);
????%計算歐氏距離
????distance?=?0;
????for?j=1:n
????????distance?=?distance?+?(fingerprint_sim(::j)-RSS_fp(ij)).^2;%這里同時計算所有參考點,結果是一個二維矩陣
????end
????distance?=?sqrt(distance);
????%將歐氏距離排序,選擇k個最小的,得到位置
????d?=?reshape(distance1size_x*size_y);
????[whatever?index_d]=sort(d);
????knn_x?=?(mod(index_d(1:k)size_x));
????knn_y?=?(floor(index_d(1:k)./size_x)+1);
????p_KNN(i1:2)?=?[mean(knn_x)?mean(knn_y)];%k個位置求平均
end
%畫一下圖:藍色的線b-o是真實路徑,紅星是定位算出的位置
plot(p_true(:1)p_true(:2)‘b-o‘);
axis([0?20?0?15])
grid?on;hold?on;
plot(p_KNN(:1)p_KNN(:2)‘r*‘);
for?i=1:size(p_KNN)
????hold?on;plot([p_KNN(i1)p_true(i1)][p_KNN(i2)p_true(i2)]‘g--‘);
end
error_KNN=sqrt((p_true(:1)-p_KNN(:1)).^2+(p_true(:2)-p_KNN(:2)).^2);
disp(‘KNN平均誤差:‘)
disp(mean(error_KNN));
%%
%KNN算法是最簡單實用的方法
%參數k可以自己稍微調一調
%另外所謂的WKNN(求k個位置平均的時候使用加權平均),改善效果忽略不計
%除了歐氏距離,我們也可以用其他的距離(曼哈頓距離啊什么的)
%這種算法本身沒有一個嚴格的證明來反映定位精度,所有各種參數隨便調,各種細節也能隨便改,相要深入研究指紋法的話去看概率方法吧。
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????1574??2015-05-30?10:29??positioning_simulation.m
?????文件???????10948??2015-05-30?10:06??data.mat
評論
共有 條評論