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