基于jupyter notebook的python编程-----通过python编程实现RSSI指纹定位技术仿真目录
在进行物联网定位的学习时,各种定位方法是我们物联网或者是通信专业必须要了解的算法,只有理解各个算法之间的优劣,我们才能够知道如何进行定位通信的设定,本次博客,林君学长主要带大家了解,如何通过python语言,实现对KNN、WKNN、NN三种RSSI指纹定位算法的比较试验,一起来看吧!
一、RSSI指纹定位简介
1、什么是RSSI指纹定位?
基于RSSI最传统的指纹识别——首先分两个阶段:离线和在线。我的理解是离线阶段选取参考点,测参考点处多个AP的RSSI值,存到指纹数据库里。在线阶段也是测未知点处多个AP的RSSI值,然后跟指纹数据里对,哪个接近就是哪个参考点位置
2、RSSI指纹定位原理
基于位置指纹的室内定位算法原理分为数据库建立阶段和位置估计阶段,如下图所示:
1)、数据库建立阶段—位置指纹库原理
2)、位置估计阶段算法原理
通过以上原理,我们便可以试验对RSSI指纹定位的算法编写,可以看到,以上的主要算法就是KNN、WKNN、NN三种指纹定位算法,我们需要做的就是通过python代码实现对三种指纹算法的比较,接下来,就通过python代码实现对三种算法的拟合吧!
二、RSSI指纹定位python代码仿真
1、指纹定位python代码仿真
1)、导入需要的python库
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
- numpy:做矩阵运算和产生随机数
- matplotlib:作CDF曲线图
2)、指纹数据库的函数定义
def database1(A,sigma):
A=np.array(A)
pd0=0
n=3
m=A.shape[0]
tt=5
coor=np.array([0,0])
RSSI=np.array([0,0,0,0])
rssi=np.array([[],[],[],[]])
for i in range(10,500,10):
for j in range(10,500,10):
coor1=[i,j]
coor=np.vstack((coor,coor1))
d1=A-np.ones((m,1))*coor1
d2=np.sqrt(np.array([np.sum(d1**2,axis=1)]).T)
d=d2**(1/2)
for k in range(tt):
t=pd0-10*n*np.log10(d)-(10**(sigma/10))*random.random(size=(m,1))
rssi=np.hstack((rssi,t))
RSS_m=np.array([np.mean(rssi,1)])
RSSI=np.vstack((RSSI,RSS_m))
rssi=np.array([[],[],[],[]])
coor=np.delete(coor,0,axis=0)
RSSI=np.delete(RSSI,0,axis=0)
X=np.hstack((coor,RSSI))
return X
A为BSs的坐标,sigma是RSSI测量的标准差,通过以上函数,便实现对位置指纹库模拟
3)、位置估计算法KNN、NN、WKNN的python代码如下所示
for i in range(number):
MS=[400*random.random(),400*random.random()]
r1=A-np.ones((4,1))*MS
r2=np.sqrt(np.array([np.sum(r1**2,axis=1)]).T)
for k in range(tt):
t=pd0-10*n*np.log10(r2)-(10**(std_var/10))*random.randn(4,1)
rssi=np.hstack((rssi,t))
RSSI=np.array([np.mean(rssi,1)]).T
rssi=np.array([[],[],[],[]])
X=database1(A,std_var)
m=X.shape[0]
for j in range(m):
distance=np.insert(distance,j,np.linalg.norm(X[j,2:]-RSSI.T))
C=np.sort(distance)
I=np.argsort(distance)
distance=np.array([])
K=3
match_result=X[I[0:K],0:2]
est1=np.mean(match_result,0)
RMSE1=np.insert(RMSE1,i,np.linalg.norm(est1-MS))
weight=1/C[0:K]
weight=np.array([weight.T/np.sum(weight,axis=0)]).T
a=np.hstack((weight*np.array([match_result[:,0]]).T,weight*np.array([match_result[:,1]]).T))
est2=np.sum(a,0)
RMSE2=np.insert(RMSE2,i,np.linalg.norm(est2-MS))
est3=X[I[0],0:2]
RMSE3=np.insert(RMSE3,i,np.linalg.norm(est3-MS))
RMSE=np.array([])
for i in range(21):
RMSE=np.insert(RMSE,i,i)
p1=np.array([])
p2=np.array([])
p3=np.array([])
for h in range(len(RMSE)):
n1=0
n2=0
n3=0
for j in range(number):
if RMSE1[j]<=RMSE[h]:
n1=n1+1
if RMSE2[j]<=RMSE[h]:
n2=n2+1
if RMSE3[j]<=RMSE[h]:
n3=n3+1
p1=np.insert(p1,h,n1/number)
p2=np.insert(p2,h,n2/number)
p3=np.insert(p3,h,n3/number)
根据对KNN、WKNN、NN三种不同的算法原理,完成三种不同算法的而产生的结果,p1、p2、p3分别对应KNN、WKNN、NN三种算法的结果
4)、做出结果曲线图
plt.plot(RMSE,p1,"-o",RMSE,p2,"-s",RMSE,p3,"-x")
plt.legend(["KNN","WKNN","NN"],loc='upper left')
plt.xlabel('The localization error(m)')
plt.ylabel('CDF')
plt.title('m-cdf')
plt.show()
2、仿真结果
1)、python仿真结果如下所示:
2)、对比matlab的仿真结果:
3、仿真结论
1)、RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值来得到
2)、定位指纹数据库的建立是基于网格形式产生不同的指纹节点。
3)、由上图可以得出结论,对于KNN和WKNN算法的拟合性比NN拟合性较好,对出现在一个区域识别的概率较大,定位精度就越高
4)、累积分布函数(CDF)是概率密度函数的积分,能完整描述一个实随机变量X的概率分布
5)、随着定位误差的逐渐增大,KNN和WKNN的优势逐渐凸显出来,CDF概率曲线分布更加明显,这意味着定位越精确!
三、RSSI指纹定位技术源码
提示: 对于RSSI指纹定位Python代码,需要运行大约3分钟,所以每当我们运行的时候,不要着急关闭,3分钟之后,结果才会出来,这是因为循环的次数过多,代码运算量大,等待就好!
对于Matlab代码,需要等待大约1分钟,所以Matlab在运行的时候,我们也需要等待一会就好,同样是因为代码运算量大的原因!
1、python仿真源码如下所示
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
def database1(A,sigma):
A=np.array(A)
pd0=0
n=3
m=A.shape[0]
tt=5
coor=np.array([0,0])
RSSI=np.array([0,0,0,0])
rssi=np.array([[],[],[],[]])
for i in range(10,500,10):
for j in range(10,500,10):
coor1=[i,j]
coor=np.vstack((coor,coor1))
d1=A-np.ones((m,1))*coor1
d2=np.sqrt(np.array([np.sum(d1**2,axis=1)]).T)
d=d2**(1/2)
for k in range(tt):
t=pd0-10*n*np.log10(d)-(10**(sigma/10))*random.random(size=(m,1))
rssi=np.hstack((rssi,t))
RSS_m=np.array([np.mean(rssi,1)])
RSSI=np.vstack((RSSI,RSS_m))
rssi=np.array([[],[],[],[]])
coor=np.delete(coor,0,axis=0)
RSSI=np.delete(RSSI,0,axis=0)
X=np.hstack((coor,RSSI))
return X
BS1=[0,0]
BS2=[500,0]
BS3=[500,500]
BS4=[0,500]
std_var=4
A=[BS1,BS2,BS3,BS4]
pd0=0
n=3
tt=5
number=1000
RMSE1=np.array([])
RMSE2=np.array([])
RMSE3=np.array([])
distance=np.array([])
rssi=np.array([[],[],[],[]])
for i in range(number):
MS=[400*random.random(),400*random.random()]
r1=A-np.ones((4,1))*MS
r2=np.sqrt(np.array([np.sum(r1**2,axis=1)]).T)
for k in range(tt):
t=pd0-10*n*np.log10(r2)-(10**(std_var/10))*random.randn(4,1)
rssi=np.hstack((rssi,t))
RSSI=np.array([np.mean(rssi,1)]).T
rssi=np.array([[],[],[],[]])
X=database1(A,std_var)
m=X.shape[0]
for j in range(m):
distance=np.insert(distance,j,np.linalg.norm(X[j,2:]-RSSI.T))
C=np.sort(distance)
I=np.argsort(distance)
distance=np.array([])
K=3
match_result=X[I[0:K],0:2]
est1=np.mean(match_result,0)
RMSE1=np.insert(RMSE1,i,np.linalg.norm(est1-MS))
weight=1/C[0:K]
weight=np.array([weight.T/np.sum(weight,axis=0)]).T
a=np.hstack((weight*np.array([match_result[:,0]]).T,weight*np.array([match_result[:,1]]).T))
est2=np.sum(a,0)
RMSE2=np.insert(RMSE2,i,np.linalg.norm(est2-MS))
est3=X[I[0],0:2]
RMSE3=np.insert(RMSE3,i,np.linalg.norm(est3-MS))
RMSE=np.array([])
for i in range(21):
RMSE=np.insert(RMSE,i,i)
p1=np.array([])
p2=np.array([])
p3=np.array([])
for h in range(len(RMSE)):
n1=0
n2=0
n3=0
for j in range(number):
if RMSE1[j]<=RMSE[h]:
n1=n1+1
if RMSE2[j]<=RMSE[h]:
n2=n2+1
if RMSE3[j]<=RMSE[h]:
n3=n3+1
p1=np.insert(p1,h,n1/number)
p2=np.insert(p2,h,n2/number)
p3=np.insert(p3,h,n3/number)
plt.plot(RMSE,p1,"-o",RMSE,p2,"-s",RMSE,p3,"-x")
plt.legend(["KNN","WKNN","NN"],loc='upper left')
plt.xlabel('The localization error(m)')
plt.ylabel('CDF')
plt.title('m-cdf')
plt.show()
2、matlab仿真源码如下所示
% %% the simulation of RSSI localization algorithm
clear all;
clc;
BS1=[0,0];BS2=[500,0];BS3=[500, 500];BS4=[0,500];
std_var=4;
A=[BS1;BS2;BS3;BS4];
pd0=0;n=3;
tt=5; % the number of RSSI measurement for each BS
number= 1000;
for i=1:number
MS=[400*rand,400*rand];
r1=A-ones(4,1)*MS;
r2=(sum(r1.^2,2)).^(1/2);
w=randn(4,1)
for k=1:tt
rssi(:,k)=pd0-10* n*log(r2)-10^(std_var/10)*randn(4,1);
end
RSSI=mean(rssi,2);
X=database1(A,std_var);
[m,~]=size(X);
for j=1:m
distance(j)=norm(X(j,3:end)-RSSI');
end
[C,I]=sort(distance);
K=3
match_result=X(I(1:K),1:2);
est1=mean(match_result);
RMSE1(i)=norm(est1-MS);
a6=norm(est1-MS);
weight=1./C(1:K);
weight=weight'/sum(weight);
est2=sum([weight.*match_result(:,1),weight.*match_result(:,2)]);
a7=norm(est2-MS);
RMSE2(i)=norm(est2-MS);
est3=X(I(1),1:2);
a8=norm(est2-MS);
RMSE3(i)=norm(est3-MS);
end
RMSE=0:20;
for i=1:length(RMSE)
n1=0;n2=0;n3=0;
for j=1:number
if RMSE1(j)<=RMSE(i)
n1=n1+1;
end
if RMSE2(j)<=RMSE(i)
n2=n2+1;
end
if RMSE3(j)<=RMSE(i)
n3=n3+1;
end
end
p1(i)=n1/number;p2(i)=n2/number;p3(i)=n3/number;
end
plot(RMSE,p1,'-O',RMSE,p2,'-s' ,RMSE,p3,'-x')
xlabel('The localization error (m)');
ylabel('CDF');
legend('KNN','WKNN','NN');
function[X]=database1(A,sigma)
pd0=0;n=3;
[m,~]=size(A);tt=5;
coor=[];RSSI=[];
for i=10:10:490
for j=10:10:490
coor1=[i,j];
coor=[coor;coor1];
d1=A-ones(m,1)*coor1;
d2=sum(d1.^2,2);
d=d2.^(1/2);
for k=1:tt
rssi(:,k)=pd0-10* n*log10(d)-10^(sigma/10)*randn(m,1);
end
RSS_m=mean(rssi,2)';
RSSI=[RSSI;RSS_m];
end
end
X=[coor,RSSI];
end
以上就是本次博客的全部内容啦,通过本次博客,大家可以更好的了解到RSSI指纹定位的算法原理,同时,林君学长也希望大家能够深入的了解代码的具体意思,理解原理;代码有错误的地方记得给林君学长留言改正。
遇到问题的小伙伴也记得评论区留言,林君学长看到会给大家回复解答的,这个学长不太冷!
陈一月的又一天编程岁月^ _ ^