資源簡介
精簡的knn定位算法,包含數(shù)據(jù)集,可直接運(yùn)行

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