例子滤波重要性重采样 (车轮法)

当粒子群各个粒子计算完权重之后,需要对权重归一化 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!  



猜你喜欢

转载自blog.csdn.net/qq_29796781/article/details/80259339