当粒子群各个粒子计算完权重之后,需要对权重归一化 matlab 模拟随机产生权重w_raw 归一化w_norm
N = 5;
w_raw = 10*rand(1,N);
w_norm = w_raw/sum(w_raw)
pie(w_norm)
执行显示
w_norm =
0.4083 0.1484 0.3344 0.0341 0.0747
各粒子权重比例
对权重累计求和 w_cum = cumsum(w_norm)
cumsum()函数功能是累计求和 看例子
>> A = [1,2,3,4,5,6,7,8,9]
A =
1 2 3 4 5 6 7 8 9
>> cum_A = cumsum(A)
cum_A =
1 3 6 10 15 21 28 36 45
>>
w_cum =
0.4083 0.5568 0.8912 0.9253 1.0000
重要性重采样 方法一
index = [];
for i = 1:N
r = rand(); %随机产生(0,1)的随机数
k = 1;
while (w_cum(k) < r) && (k <N)%检查 r落在w_cum哪个区间 返回落在该区间的索引值 K
k = k + 1;
end
index(i) = k+1; % K就是r落在w_cum区间是上的索引值
end
重要性重采样 方法二
% Re-sampling
% 先对之前算出的权重标准化normalize,使得他们的和为1,即将权重转化为了被抽中的概率。(注:这就是 Bayes Rule)
% 这样重新抽样(又放回)N次,得到一个新的particle集合。
% 重采样的轮子,适用于所有的 Particle Filters,不需要修改~
N = 5; %抽样N次
w_raw = rand(1,N);
w_norm = w_raw/sum(w_raw)
index = int(rand() * N); % 整数
res_index = [];
beta = 0.0;
mw = max(w_norm);
for i = 1:N
beta = beta + rand() * 2.0 * mw % 每次抽样都添加一个挺大的步长
while beta > w_norm(index) % 看看我的步长能消耗掉几个粒子的weight,weight越小的地方,跨过的particle越多,即采样的跨度大,频率小,反之则反
beta = beta - w_norm(index)
index = (index + 1) % N
end
res_index(i) = index;
end
# Re-sampling
# 先对之前算出的权重标准化normalize,使得他们的和为1,即将权重转化为了被抽中的概率。(注:这就是 Bayes Rule)
# 这样重新抽样(又放回)N次,得到一个新的particle集合。
# 重采样的轮子,适用于所有的 Particle Filters,不需要修改~
N = 5 #粒子数量
p3 = []
index = int(random.random() * N)
beta = 0.0
mw = max(w)
# 抽样N次
for i in range(N):
beta += random.random() * 2.0 * mw # 每次抽样都添加一个挺大的步长
while beta > w[index]: # 看看我的步长能消耗掉几个粒子的weight,weight越小的地方,跨过的particle越多,即采样的跨度大,频率小,反之则反
beta -= w[index]
index = (index + 1) % N
p3.append(p[index])
p = p3
print p #please leave this print statement here for grading!