例子濾波重要性重採樣 (車輪法)

當粒子羣各個粒子計算完權重之後,需要對權重歸一化 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!  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章