隱馬爾可夫模型模型評估及最優路徑的matlab實現

本身根據算法編寫了兩個簡單的matlab代碼,應用於例子中的數據取得了正確的解,這裏並無考慮速度優化的問題,請你們不吝指教:算法

1.模型評估優化

HMM模型以下,試根據前向算法計算產生觀察符號序列O={ABAB}的機率。 
狀態轉移機率矩陣
a = [0.4 0.6 0 ;
        0   0.8 0.2;
        0   0    1 ];
觀測矩陣:
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 = [1 0 0];
例題中的計算步驟:
1.當t = 1時
2.當t = 2時
3.當t = 3時
4.當t = 4時
最終有:
P(O| λ)= a4(1)+ a4(2)+ a4(3)=0.0717696
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);

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

能夠看出是與例題中計算出的結果是同樣的。

相關文章
相關標籤/搜索