1.算法描述
重采样的主要方法有随机重采样,多项式重采样,分层重采样,系统重采样,残差重采样,MSV重采样等。
a.随机采样是一种利用分层统计思想设计出来的,将空间均匀划分,粒子打点后会产生高集中的均匀分布区,将各分布区的粒子点进行权重累计并解算(例如求平均权重),生成若干个区间权重,使用该信息进行求解。其理解起来的几何思想就是给粒子点做索引编号,对应较多的索引编号将会保留,而较少的就会被淘汰。随机采样可能会因为存在多个权重接近的均匀区而产生求解方向错误,甚至陷入局部最优。以下给出一段随机采样的matlab代码。[1]随后几种其他重采样方法代码不再展示。
b.多项式采样是1993年提出的改进,基本解决了粒子滤波的粒子退化问题。其基本形式与推进思想与随机采样相似,不同在于多项式采样会不断记录并复制计算相似或相同结果的权重累计值,从而得到最优的发展结果。
c.系统重采样是2000年提出的,这种算法与多项式采样算法较为近似,即将原有的权重空间分层,在每一层中抽取粒子,而系统重采样产生了一个随机数来供所有层使用,其结果更加均匀。
d.残差重采样法是1998年提出的,它以多项式重采样法为基础,其基本思想是直接保留原有的权重大的粒子,剩下的不足部分随机选取重新赋权的粒子补充。
e.分层采样是分别对每个类别进行随机采样。分层采样往往是为保证在采样空间或类型选取上的均匀性及代表性所采用的方法。分层的依据可因精度评价的目标而异,常用的分层有地理区、自然生态区、行政区域或分类后的类别等。
f.最小采样方差(MSV:minimum sampling variance)最优重采样方法,在满足渐近无偏性的前提下获得最小采样方差.方法:给出三种"重采样同分布"测度方法:Kullback-Leibler偏差,Kolmogorov-Smirnov统计和采样方差(sampling variance).所提出的最小采样方差重采样放宽了无偏性条件,仅满足渐近无偏,但获得了最小采样方差(参见定理2-4论证以及仿真性能对比).
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
clear all;
close all;
warning off;
addpath 'func\';
for ij = 1:100
rng(ij);
ij
global NUM;
global NOISE;
global XY_pso;
%粒子滤波学习因子
c1 = 0.3;
c2 = 0.3;
%惯性权重
w = 0.75;
%粒子数量
N = 100;
ITER = 200;
wmax = 0.9;
wmin = 0.4;
D = 2;
NUM = 7;
BS = [0, 0, 1.5, 1.5, 0, -1.5, -1.5;
0, sqrt(3), 0.5*sqrt(3), -0.5*sqrt(3), -sqrt(3), -0.5*sqrt(3), 0.5*sqrt(3)];
for i = 1:NUM
X_(1,i) = BS(1,i);
X_(2,i) = BS(2,i);
end
R = 3000;
XY_robot = R/3+2*R/3*rand(1,D);%定义真实位置
XY_pso = R*X_;
for i = 1:NUM
R0(i) = sqrt((XY_pso(1,i) - XY_robot(1))^2 + (XY_pso(2,i) - XY_robot(2))^2);
end
for i = 1:NUM-1
R_n(i)=R0(i+1)-R0(1);
end
NOISE = R_n+10*randn(1,NUM-1);
%50的时候产生强干扰
if ij >= 50 & ij <= 60
NOISE = R_n+200-20*(ij-50)*ones(1,NUM-1);
end
%粒子初始化
x = rand(N,D);
v = rand(N,D);
for i=1:N
p(i) = fitness(x(i,:));
y(i,:) = x(i,:);
end
pg = x(N,:);
for i=1:(N-1)
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);
end
end
%开始粒子滤波
for t=1:ITER
for j=1:N
fv(j)=fitness(x(j,:));
end
fvag = sum(fv)/N;
fmin = sum(fv);
%自适应权重计算公式
for i=1:N
if fv(i)<fvag
w = wmin + (fv(i)-fmin)*(wmax-wmin)/(fvag-fmin);
else
w = wmax;
end
v(i,:) = w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:) = x(i,:) + v(i,:);
if x(i,1)<0
x(i,1)=0;
end
if x(i,2)<0
x(i,2)=0;
end
if x(i,1)>=R
x(i,1)=R;
end
if x(i,2)>=R
x(i,2)=R;
end
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
%分层重采样算法
x = resample0(1:N,p',x); %重采样
end
xm = pg';
fv = fitness(pg);
%计算误差
ERR(ij) = abs([(XY_robot(1)-xm(1))+(XY_robot(2)-xm(2))]/2);
%这里用简化方式效果更好些
ERR2(ij)= N/(ERR(ij)+1);
end
02_070m