1. 救命啊!!關於改進粒子濾波演算法問題
粒子濾波演算法受到許多領域的研究人員的重視,該演算法的主要思想是使用一個帶有權值的粒子集合來表示系統的後驗概率密度.在擴展卡爾曼濾波和Unscented卡爾曼濾波演算法的基礎上,該文提出一種新型粒子濾波演算法.首先用Unscented卡爾曼濾波器產生系統的狀態估計,然後用擴展卡爾曼濾波器重復這一過程並產生系統在k時刻的最終狀態估計.在實驗中,針對非線性程度不同的兩種系統,分別採用5種粒子濾波演算法進行實驗
2. 粒子濾波演算法中粒子分布圖怎麼畫呀
matlab中畫
如果每次迭代都畫出來比較麻煩
3. 粒子濾波演算法的具體流程是怎樣的
粒子濾波(PF: Particle Filter)演算法起源於20世紀50年代Poor Man's Monte Carlo問題的研究,但第一個具有應用性的粒子濾波演算法於1993年由Gordon等提出(「A novel Approach to nonlinear/non-Gaussian Bayesian State estimation」)。它是利用粒子集來表示概率,可以用在任何形式的狀態空間模型上。其核心思想是通過從後驗概率中抽取的隨機狀態粒子來表示其分布情況,是一種順序重要性采樣法(Sequential Importance Sampling)。
粒子濾波的應用非常廣泛,尤其是在目標跟蹤(「A probabilistic framework for matching temporal trajectories」)等視覺任務方面。粒子濾波演算法有許多不同的改進方式。針對不同的問題,PF演算法被改造以適應更好的問題。本文主要側重於目標跟蹤方面的應用。以人臉跟蹤為例,下圖展示了粒子濾波的跟蹤結果。下面介紹下粒子濾波的基本過程:初始化、概率轉移、權重重計算和重采樣四個階段。
1.初始化階段
跟蹤區域初始化。在使用粒子濾波演算法進行目標跟蹤前需要選擇要跟蹤的目標物體。這個過程可以用人工劃定方法和自動識別方法。使用人工的方法可以通過滑鼠在圖像區域標記出一個感興趣矩形;使用自動的方法就是利用自動的目標檢測技術,初步檢測出圖像中要跟蹤物體的大致位置。以人臉跟蹤為例,人工方法就是滑鼠劃定視頻第一幀中人臉的區域;自動方法就是可以使用人臉檢測演算法檢測出人臉的初始位置。
粒子初始化。對於本文人臉檢測的示例,粒子就是圖像中的矩形區域,主要由矩形中心(x,y)和寬高(w,h)四個變數表示。粒子初始化的步驟,就是在圖像中選擇指定數量的粒子(矩形),比如N=100個粒子。粒子初始化過程就是在圖像中隨機或指定方式放粒子。比如說,我們可以指定100個粒子初始狀態和跟蹤區域一致,即粒子參數和跟蹤區域的(x,y,w,h)相等。
2.狀態轉移階段
使用粒子濾波演算法來對目標進行跟蹤,即是通過前一次的先驗概率來估算出當前環境下的後驗概率密度,這個過程也是由粒子來完成的。具體來說,即根據上一幀中粒子的狀態(x,y,w,h)t-1,來估計出本幀中各個粒子的狀態(x,y,w,h)t。從上一幀圖像的粒子狀態轉變為當前幀粒子的狀態,這個變異過程就叫作轉移(transmission)。粒子濾波的轉移方程跟Kalman濾波的差不多:
上面的是狀態轉移方程,下面的為觀測方程,wk和vk是高斯雜訊。在本文示例中,xk=(x,y,w,h)t。變數x,y,w,h可以依據公式(1)分別更新。在不同的演算法中,f採用的函數也不相同。如果xk=xk-1+wk,則狀態轉移方程其實是隨機遊走過程;如果xk=Axk-1+wk,狀態轉移方程則為一階自回歸方程;如果xk=A1xk-1+A2xk-2+wk,則狀態轉移方程為二階自回歸方程。
3.權重重計算階段
轉移階段將上一幀中粒子的位置進行了轉移,得到當前幀中新的位置。但並不是所有粒子的作用都有用。也就是有些粒子並不是跟蹤區域所要所移動的位置。因此,在此階段,粒子濾波演算法將對每個粒子進行打分,將得分較低的粒子刪除,將得分多的粒子生成更多的粒子(重采樣過程完成)。具體打分的方法根據不同的需求會不同,例如人臉跟蹤方法中使用距離作為衡量的標准。將每個粒子與跟蹤區域進行相似度計算(在這里,分別提取粒子和跟蹤區域的視覺特徵進行計算,比如顏色直方圖),使用相似度作為相應粒子的權重。每一個粒子都需要計算其權重,並且需要將其歸一化。該階段其實也是後驗概率進行更新的過程。
4.重采樣階段
粒子濾波演算法會淘汰權值低的粒子,讓權值高的粒子來產生出更多的粒子,這就使得演算法朝著權值高的地方收斂。假設有100個粒子,1號粒子的權重為0.02而2號粒子的權重為0.003。於是在重采樣階段,1號粒子生孩子的指標是0.02×100=2,2號粒子的指標是0.003×100=0.3,可以發現,1號粒子除了剛產生的粒子外還要再額外的產生一個粒子,而2號粒子就被鏟除了。如此,最後得到的100個粒子即為所求,然後取個加權平均就得到了目標的狀態值。
4. 有人做過用粒子濾波來跟蹤目標的嗎我想問一下,我怎麼知道系統狀態方程看很多matlab的模擬中用的狀態方
clear;
% tic;
x = 0.1; % 初始狀態
x_estimate = 1;%狀態的估計
e_x_estimate = x_estimate; %EKF的初始估計
u_x_estimate = x_estimate; %UKF的初始估計
p_x_estimate = x_estimate; %PF的初始估計
Q = 10;%input('請輸入過程雜訊方差Q的值: '); % 過程狀態協方差
R = 1;%input('請輸入測量雜訊方差R的值: '); % 測量雜訊協方差
P =5;%初始估計方差
e_P = P; %UKF方差
u_P = P;%UKF方差
pf_P = P;%PF方差
tf = 50; % 模擬長度
x_array = [x];%真實值數組
e_x_estimate_array = [e_x_estimate];%EKF最優估計值數組
u_x_estimate_array = [u_x_estimate];%UKF最優估計值數組
p_x_estimate_array = [p_x_estimate];%PF最優估計值數組
u_k = 1; %微調參數
u_symmetry_number = 4; % 對稱的點的個數
u_total_number = 2 * u_symmetry_number + 1; %總的采樣點的個數
linear = 0.5;
N = 500; %粒子濾波的粒子數
close all;
%粒子濾波初始 N 個粒子
for i = 1 : N
p_xpart(i) = p_x_estimate + sqrt(pf_P) * randn;
end
for k = 1 : tf
% 模擬系統
x = linear * x + (25 * x / (1 + x^2)) + 8 * cos(1.2*(k-1)) + sqrt(Q) * randn; %狀態值
y = (x^2 / 20) + sqrt(R) * randn; %觀測值
%擴展卡爾曼濾波器
%進行估計 第一階段的估計
e_x_estimate_1 = linear * e_x_estimate + 25 * e_x_estimate /(1+e_x_estimate^2) + 8 * cos(1.2*(k-1));
e_y_estimate = (e_x_estimate_1)^2/20; %這是根據k=1時估計值為1得到的觀測值;只是這個由我估計得到的 第24行的y也是觀測值 不過是由加了雜訊的真實值得到的
%相關矩陣
e_A = linear + 25 * (1-e_x_estimate^2)/((1+e_x_estimate^2)^2);%傳遞矩陣
e_H = e_x_estimate_1/10; %觀測矩陣
%估計的誤差
e_p_estimate = e_A * e_P * e_A' + Q;
%擴展卡爾曼增益
e_K = e_p_estimate * e_H'/(e_H * e_p_estimate * e_H' + R);
%進行估計值的更新 第二階段
e_x_estimate_2 = e_x_estimate_1 + e_K * (y - e_y_estimate);
%更新後的估計值的誤差
e_p_estimate_update = e_p_estimate - e_K * e_H * e_p_estimate;
%進入下一次迭代的參數變化
e_P = e_p_estimate_update;
e_x_estimate = e_x_estimate_2;
% 粒子濾波器
% 粒子濾波器
for i = 1 : N
p_xpartminus(i) = 0.5 * p_xpart(i) + 25 * p_xpart(i) / (1 + p_xpart(i)^2) + 8 * cos(1.2*(k-1)) + sqrt(Q) * randn; %這個式子比下面一行的效果好
% xpartminus(i) = 0.5 * xpart(i) + 25 * xpart(i) / (1 + xpart(i)^2) + 8 * cos(1.2*(k-1));
p_ypart = p_xpartminus(i)^2 / 20; %預測值
p_vhat = y - p_ypart;% 觀測和預測的差
p_q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-p_vhat^2 / 2 / R); %各個粒子的權值
end
% 平均每一個估計的可能性
p_qsum = sum(p_q);
for i = 1 : N
p_q(i) = p_q(i) / p_qsum;%各個粒子進行權值歸一化
end
% 重采樣 權重大的粒子多采點,權重小的粒子少採點, 相當於每一次都進行重采樣;
for i = 1 : N
p_u = rand;
p_qtempsum = 0;
for j = 1 : N
p_qtempsum = p_qtempsum + p_q(j);
if p_qtempsum >= p_u
p_xpart(i) = p_xpartminus(j); %在這里 xpart(i) 實現循環賦值;終於找到了這里!!!
break;
end
end
end
p_x_estimate = mean(p_xpart);
% p_x_estimate = 0;
% for i = 1 : N
% p_x_estimate =p_x_estimate + p_q(i)*p_xpart(i);
% end
%不敏卡爾曼濾波器
%采樣點的選取 存在x(i)
u_x_par = u_x_estimate;
for i = 2 : (u_symmetry_number+1)
u_x_par(i,:) = u_x_estimate + sqrt((u_symmetry_number+u_k) * u_P);
end
for i = (u_symmetry_number+2) : u_total_number
u_x_par(i,:) = u_x_estimate - sqrt((u_symmetry_number+u_k) * u_P);
end
%計算權值
u_w_1 = u_k/(u_symmetry_number+u_k);
u_w_N1 = 1/(2 * (u_symmetry_number+u_k));
%把這些粒子通過傳遞方程 得到下一個狀態
for i = 1: u_total_number
u_x_par(i) = 0.5 * u_x_par(i) + 25 * u_x_par(i)/(1+u_x_par(i)^2) + 8 * cos(1.2*(k-1));
end
%傳遞後的均值和方差
u_x_next = u_w_1 * u_x_par(1);
for i = 2 : u_total_number
u_x_next = u_x_next + u_w_N1 * u_x_par(i);
end
u_p_next = Q + u_w_1 * (u_x_par(1)-u_x_next) * (u_x_par(1)-u_x_next)';
for i = 2 : u_total_number
u_p_next = u_p_next + u_w_N1 * (u_x_par(i)-u_x_next) * (u_x_par(i)-u_x_next)';
end
% %對傳遞後的均值和方差進行采樣 產生粒子 存在y(i)
% u_y_2obser(1) = u_x_next;
% for i = 2 : (u_symmetry_number+1)
% u_y_2obser(i,:) = u_x_next + sqrt((u_symmetry_number+k) * u_p_next);
% end
% for i = (u_symmetry_number + 2) : u_total_number
% u_y_2obser(i,:) = u_x_next - sqrt((u_symmetry_number+u_k) * u_p_next);
% end
%另外存在y_2obser(i) 中;
for i = 1 :u_total_number
u_y_2obser(i,:) = u_x_par(i);
end
%通過觀測方程 得到一系列的粒子
for i = 1: u_total_number
u_y_2obser(i) = u_y_2obser(i)^2/20;
end
%通過觀測方程後的均值 y_obse
u_y_obse = u_w_1 * u_y_2obser(1);
for i = 2 : u_total_number
u_y_obse = u_y_obse + u_w_N1 * u_y_2obser(i);
end
%Pzz測量方差矩陣
u_pzz = R + u_w_1 * (u_y_2obser(1)-u_y_obse)*(u_y_2obser(1)-u_y_obse)';
for i = 2 : u_total_number
u_pzz = u_pzz + u_w_N1 * (u_y_2obser(i) - u_y_obse)*(u_y_2obser(i) - u_y_obse)';
end
%Pxz狀態向量與測量值的協方差矩陣
u_pxz = u_w_1 * (u_x_par(1) - u_x_next)* (u_y_2obser(1)-u_y_obse)';
for i = 2 : u_total_number
u_pxz = u_pxz + u_w_N1 * (u_x_par(i) - u_x_next) * (u_y_2obser(i)- u_y_obse)';
end
%卡爾曼增益
u_K = u_pxz/u_pzz;
%估計量的更新
u_x_next_optimal = u_x_next + u_K * (y - u_y_obse);%第一步的估計值 + 修正值;
u_x_estimate = u_x_next_optimal;
%方差的更新
u_p_next_update = u_p_next - u_K * u_pzz * u_K';
u_P = u_p_next_update;
%進行畫圖程序
x_array = [x_array,x];
e_x_estimate_array = [e_x_estimate_array,e_x_estimate];
p_x_estimate_array = [p_x_estimate_array,p_x_estimate];
u_x_estimate_array = [u_x_estimate_array,u_x_estimate];
e_error(k,:) = abs(x_array(k)-e_x_estimate_array(k));
p_error(k,:) = abs(x_array(k)-p_x_estimate_array(k));
u_error(k,:) = abs(x_array(k)-u_x_estimate_array(k));
end
t = 0 : tf;
figure;
plot(t,x_array,'k.',t,e_x_estimate_array,'r-',t,p_x_estimate_array,'g--',t,u_x_estimate_array,'b:');
set(gca,'FontSize',10);
set(gcf,'color','White');
xlabel('時間步長');% lable --->label 我的神
ylabel('狀態');
legend('真實值','EKF估計值','PF估計值','UKF估計值');
figure;
plot(t,x_array,'k.',t,p_x_estimate_array,'g--', t, p_x_estimate_array-1.96*sqrt(P), 'r:', t, p_x_estimate_array+1.96*sqrt(P), 'r:');
set(gca,'FontSize',10);
set(gcf,'color','White');
xlabel('時間步長');% lable --->label 我的神
ylabel('狀態');
legend('真實值','PF估計值', '95% 置信區間');
%root mean square 平均值的平方根
e_xrms = sqrt((norm(x_array-e_x_estimate_array)^2)/tf);
disp(['EKF估計誤差均方值=',num2str(e_xrms)]);
p_xrms = sqrt((norm(x_array-p_x_estimate_array)^2)/tf);
disp(['PF估計誤差均方值=',num2str(p_xrms)]);
u_xrms = sqrt((norm(x_array-u_x_estimate_array)^2)/tf);
disp(['UKF估計誤差均方值=',num2str(u_xrms)]);
% plot(t,e_error,'r-',t,p_error,'g--',t,u_error,'b:');
% legend('EKF估計值誤差','PF估計值誤差','UKF估計值誤差');
t = 1 : tf;
figure;
plot(t,e_error,'r-',t,p_error,'g--',t,u_error,'b:');
set(gca,'FontSize',10);
set(gcf,'color','White');
xlabel('時間步長');% lable --->label 我的神
ylabel('狀態');
legend('EKF估計值誤差','PF估計值誤差','UKF估計值誤差');
% toc;
5. 如何將下面的離散化公式用粒子(群)濾波演算法估計Qo和po(matlab程序實現).
這個確實有難度啊
6. 粒子濾波演算法是什麼時間,由誰最先提出來的
我通俗解釋一下,粒子濾波(PF)的應用大致這樣:(其實目標跟蹤的理論就是對狀態向量的實時估值)
設有一堆樣本,假設有N個,初始給他們同樣的權值1/N.
這個系統狀態轉移方程,一般是非線性的,我們只需要知道怎麼做才能把這時刻的狀態值傳播到下一個時刻.具體做法,N個樣本值通過狀態轉移得下一時刻的樣本預測值,包含過程雜訊因素.d
系統還有一個非線性的觀測方程,通過它得到真正的觀測值Z.這時候,把N個樣本預測值帶進去獲得Z『.
根據Z』和Z相差的程度,決定對這個樣本的可信程度,當然越接近的越好,然後把這些可信程度進行權值歸一化.
重采樣環節,把這些樣本按照權值進行隨機采樣(權值越高的,當然越容易被抽中.比如說,下一時刻的值,有四個樣本說等於1,有兩個樣本說等於1.5,那麼有2/3概率認為等於1.這個解釋起來真的有夠復雜的,一般做起來200~300個樣本獲得的值都接近一樣了,還要設個2/3n的閾值防止粒子匱乏,也就是防止所有樣本得到相同的後驗估計結果),獲得的值盡可能接近真實發生的情況.
循環2~5
7. 基於顏色的粒子濾波目標跟蹤演算法MATLAB模擬與改進
我這里有一個粒子群的完整範例:functionmain()clc;clearall;closeall;tic;%程序運行計時E0=0.001;%允許誤差MaxNum=100;%粒子最大迭代次數narvs=1;%目標函數的自變數個數particlesize=30;%粒子群規模c1=2;%每個粒子的個體學習因子,也稱為加速常數c2=2;%每個粒子的社會學習因子,也稱為加速常數w=0.6;%慣性因子vmax=0.8;%粒子的最大飛翔速度x=-5+10*rand(particlesize,narvs);%粒子所在的位置v=2*rand(particlesize,narvs);%粒子的飛翔速度%用inline定義適應度函數以便將子函數文件與主程序文件放在一起,%目標函數是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))%inline命令定義適應度函數如下:fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');%inline定義的適應度函數會使程序運行速度大大降低fori=1:particlesizeforj=1:narvsf(i)=fitness(x(i,j));endendpersonalbest_x=x;personalbest_faval=f;[globalbest_favali]=min(personalbest_faval);globalbest_x=personalbest_x(i,:);k=1;whilek<=MaxNumfori=1:particlesizeforj=1:narvsf(i)=fitness(x(i,j));endiff(i)vmax;v(i,j)=vmax;elseifv(i,j)<-vmax;v(i,j)=-vmax;endendx(i,:)=x(i,:)+v(i,:);endifabs(globalbest_faval)<E0,break,endk=k+1;endValue1=1/globalbest_faval-1;Value1=num2str(Value1);%strcat指令可以實現字元的組合輸出disp(strcat('themaximumvalue','=',Value1));%輸出最大值所在的橫坐標位置Value2=globalbest_x;Value2=num2str(Value2);disp(strcat('thecorrespondingcoordinate','=',Value2));x=-5:0.01:5;y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);plot(x,y,'m-','linewidth',3);holdon;plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);legend('目標函數','搜索到的最大值');xlabel('x');ylabel('y');gridon;toc;
8. 誰有無跡kalman粒子濾波的matlab程序能否分享一下。
clear;clc;
A = [1.1269 -0.4940 0.1129
1.0000 0 0
0 1.0000 0];
B = [-0.3832
0.5919
0.5191];
C = [1 0 0];
Plant = ss(A,[B B],C,0,-1,'inputname',{'u' 'w'},'outputname','y');
Q = 1; R = 1;
[kalmf,L,P,M] = kalman(Plant,Q,R);
a = A;
b = [B B 0*B];
c = [C;C];
d = [0 0 0;0 0 1];
P = ss(a,b,c,d,-1,'inputname',{'u' 'w' 'v'},'outputname',{'y' 'yv'});
sys = parallel(P,kalmf,1,1,[],[])
% Close loop around input #4 and output #2
SimModel = feedback(sys,1,4,2,1)
% Delete yv from I/O list
SimModel = SimModel([1 3],[1 2 3])
t = [0:100]';
u = sin(t/5);
n = length(t)
randn('seed',0)
w = sqrt(Q)*randn(n,1);
v = sqrt(R)*randn(n,1);
[out,x] = lsim(SimModel,[w,v,u]);
y = out(:,1); % true response
ye = out(:,2); % filtered response
yv = y + v; % measured response
subplot(211), plot(t,y,'--',t,ye,'-'),
xlabel('No. of samples'), ylabel('Output')
title('Kalman filter response')
subplot(212), plot(t,y-yv,'-.',t,y-ye,'-'),
xlabel('No. of samples'), ylabel('Error')
MeasErr = y-yv;
MeasErrCov = sum(MeasErr.*MeasErr)/length(MeasErr);
EstErr = y-ye;
EstErrCov = sum(EstErr.*EstErr)/length(EstErr);