2017-02-22 6 views
0

Ich habe versucht, das Ergebnis Likelihood Problem zu lösen implementieren sowohl Vorwärts-und Rückwärts-Algorithmus in Matlab, aber sie geben unterschiedliche Antworten. Ich weiß nicht, was ich in meinem Rückwärtscode falsch gemacht habe (der Vorige stimmt mit der Antwort überein). Kann mir jemand helfen?Rückwärtsalgorithmus gibt eine andere Antwort

%Forward Algorithm for HMM Problem 
clc;clear; 

states=['A','B']; %The N "hidden" states 
N=length(states); 
emmision_letters=['x','y','z']; % the emission letters. 

%Initial Probabilities of states has equalized probablity. 
I_prob=repelem(1/N, N)'; 
% Transition probabilities of states 
T_prob=[0.303 0.697; 
     0.831 0.169 ]; 
% Emission prob(Prob of emission letters from given the state) 
E_prob=[0.533 0.065 0.402; 
     0.342 0.334 0.324]; 
input_em='xzyyzzyzyy'; % emission letters 
emlist=zeros(1,length(input_em)); %generate the list of the emission letters. 

for i =1:length(input_em) 
    if input_em(i)=='x' 
     emlist(i)=1; 
    elseif input_em(i)=='y' 
     emlist(i)=2; 
    elseif input_em(i)=='z' 
     emlist(i)=3; 
    end 
end 

lem=length(emlist); 

Fq=zeros(N,lem); 
Bq=zeros(N,lem);% the table hold the values 

%Forward 
for i=1:lem 
    if i==1 
     %for i=1, Fq(1)=a_qstart*eq(x1) 
     Fq(:,i)=I_prob.*E_prob(:,emlist(i)); 
    else 
     % for i=2...n, for each q in Q, Fq(i)=sum(Fq(i-1)*a_qq'*e_q(xi)) 
     for j=1:N 
      %Fq(i)=sum{fq(i-1)*Aqq'*Eq(xi)} 
      Fq(j,i)=sum(Fq(:,i-1).*T_prob(:,j)).*E_prob(j,emlist(i)); 
     end 
    end 
end 
sum(Fq(:,lem)) % the last one represent the whole sequence 


% Backward Algorithm for HMM Problem 
    for i=lem:-1:1 
     if i==lem 
      % for i =n, Bq(n)=1 
      Bq(:,i)=1; 
     else 
      % for i=n-1...1, for each q in Q 
      for j=1:N 
       % instead of calculate transition into A/B in i, 
       % calculate which jump out of A/B in step i+1 
       % Bq(i)=sum(Bq(i+1)*a_qq'*e_q(x_i+1)) 
       Bq(j,i)=sum(Bq(:,i+1).*T_prob(j,:)').* E_prob(j,emlist(i+1)); 
      end 
     end 
    end 

    sum(Bq(:,1)) 

Ich kann nicht sehen, was falsch ist. Vielen Dank für Ihre Hilfe!

Antwort

1

$$ B_q (i) = \ sum_ {q^\ prime \ in Q} (a_ {qq^\ prim} e_ {q^\ prim x_ {i + 1}} B_ {q^{\ prim }} (i + 1)) $$

In Ihrer for-Schleife:

Bq(j,i)=sum(Bq(:,i+1).*T_prob(j,:)').* E_prob(:,emlist(i+1)); 

ich denke, das wird funktionieren.

+1

Vielen Dank für Ihre Antwort ~~ Ich habe gerade festgestellt, dass die Emissionswahrscheinlichkeit im Rückwärtsalgorithmus für verschiedene Zustände ist !!! 'Bq (j, i) = Summe (Bq (:, i + 1). * T_Probe (j,:) '. * E_prob (:, emlist (i + 1)));' Der Code funktionierte sehr gut. Danke vielmals. – Ellie

Verwandte Themen