本身根據算法編寫了兩個簡單的matlab代碼,應用於例子中的數據取得了正確的解,這裏並無考慮速度優化的問題,請你們不吝指教:算法
1.模型評估優化
%a矩陣是狀態轉移矩陣 a = [0.4 0.6 0 ; 0 0.8 0.2; 0 0 1 ]; %o矩陣是觀察矩陣,觀測序列是ABAB %該o矩陣根據觀測序列作了相應的擴展。 o = [0.7 0.3 0.7 0.3; 0.4 0.6 0.4 0.6; 0.8 0.2 0.8 0.2]; %pi是初始狀態機率矩陣 pi = [1 0 0]; [n,n] = size(a); [n,T] = size(o); n = length(pi); alpha = zeros(n,T); %初始化t=1時刻的alpha矩陣 for i = 1:n alpha(i,1) = pi(i)*o(i,1); end for t = 1:T-1 for i = 1:n sum = 0; for j = 1:n sum = sum + alpha(j,t)*a(j,i); end alpha(i,t+1) = sum * o(i,t+1); end end P = 0; for i = 1:n P = P + alpha(i,T); end P
計算獲得的P值爲0.0718,與例題中獲得的結果十分接近。spa
2.最優路徑選擇問題code
例子中的計算步驟:blog
1.初始化:class
2.當t = 2時擴展
3.當t = 3時im
4.當t = 4時數據
遞推結果:img
最優狀態序列:
S1,S2,S2,S2.
matlab代碼實現:
%a矩陣是狀態轉移矩陣 a = [0.4 0.6 0 ; 0 0.8 0.2; 0 0 1 ]; %o矩陣是觀察矩陣,觀測序列是ABAB %該o矩陣根據觀測序列作了相應的擴展。 o = [0.7 0.3 0.7 0.3; 0.4 0.6 0.4 0.6; 0.8 0.2 0.8 0.2]; %pi是初始狀態機率矩陣 pi = [1 0 0]; [n,n] = size(a); [n,T] = size(o); n = length(pi); derta = zeros(n,T); pha = zeros(n,T); maxer = zeros(n,n); %初始化t=1時刻的alpha矩陣 for i = 1:n derta(i,1) = pi(i)*o(i,1); end for t = 1:T-1 for i = 1:n nu = 0; for j = 1:n maxer(j,i) = derta(j,t)*a(j,i); end if max(maxer(:,i))==0 pha(i,t+1) = 0; else [nu,pha(i,t+1)] = max(maxer(:,i)); end derta(i,t+1) = nu * o(i,t+1); end end derta pha P = 0; q = zeros(1,T); [P q(T)]= max(derta(:,T)); for i = T-1:-1:1 q(i) = pha(q(i+1),i+1); end q
運行的結果是:
q =
1 2 2 2
能夠看出是與例題中計算出的結果是同樣的。