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