連接詞識別

在論文“A Speaker-Independent, Syntax-Directed, Connected Word Recognition System Based on Hidden Markov Models and Level Building”中提到動態規劃來解決HMM連接詞識別問題,文中提到:


上面的一步已經實現,在第二層的動態規劃中,有點迷惑了。。



詳細的代碼如下:

function [Pr,Br,Wr] = levelBuilding(hmms,O)
%   hmms:HMM模型集合
%   O:觀測序列
% 返回值: Pr:最佳累積距離;Br:最佳累積距離對應的幀;Wr:最佳詞序列

    T= size(O,1); %語音幀數,觀測序列長度
    K=length(hmms);%HMM模型個數
    L=7;  %最大層數,即詞數
%At level l=1
%Initialization
      P=-inf(L,T,K);
      B=zeros(L,T,K);
      Pr=-inf(L,T);  %保存最優概率
      Br=zeros(L,T);
      Wr=zeros(L,T);
     delta=cell(1,K);
      fai=cell(1,K); %記錄狀態
      init=cell(1,K);
     trans=cell(1,K);
      %初始化
      for i=1:K
        hmm=hmms{i}.hmm; %第i個隱馬爾可夫模型的狀態數
       delta{i}=zeros(T,hmm.N); %第i個模型的token
        %初始化第i個模型的第一個狀態的概率,轉換爲對數形式
       fai{i}= zeros(T,hmm.N);
       init{i}=hmm.init;   
       trans{i}=hmm.trans;
       ind1  = find(init{i}>0);
       ind0  = find(init{i}<=0);
       init{i}(ind0) = -inf;
       init{i}(ind1) = log(init{i}(ind1));
       %初始化第i個模型的的轉移概率
      ind1 = find(trans{i}>0);
      ind0 = find(trans{i}<=0);
      trans{i}(ind0) = -inf;
      trans{i}(ind1) = log(trans{i}(ind1));
      end
     x = O(1,:);
    
   for k=1:K
      for i=1:hmms{k}.hmm.N %每個HMM的狀態數
   delta{k}(1,i) = init{k}(i) + log(mixture(hmms{k}.hmm.mix(i),x)); %初始化前向概率矩陣,初始狀態概率乘以t=1時觀測序列的輸出概率
      end
   end
  
  delta1=delta; %保存初始值,以免迭代覆蓋
 
for t=2:T %從第二個觀測序列開始
       
     for  k=1:K
         for j = 1:hmms{k}.hmm.N  %對該模型的所有狀態
       [delta{k}(t,j), fai{k}(t,j)]= max(delta{k}(t-1,:) + trans{k}(:,j)');%找出t-1時刻所有狀態最大的前向概率與轉移的矩陣kk
       x = O(t,:);
       delta{k}(t,j) = delta{k}(t,j) + log(mixture(hmms{k}.hmm.mix(j),x)); %記錄第k個詞的最大距離
         end   
         P(1,t,k)=delta{k}(t,hmms{k}.hmm.N);
         B(1,t,k)=0; %保存幀號還是0??
     end
     [pm,q]=max(P(1,t,1:K));
      Pr(1,t)=pm;
      Br(1,t)=B(1,t,q);
      Wr(1,t)=q;
end
%%%%%%%%%%%%%%%%%%%%%%level=1 End%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%level=2 開始。。。。。
%Initialization
 delta2(1,1:4)=0;  belta(1,1:4)=0;
for l=2:L
  
    for t=2:T %從第二個觀測序列開始
    
        temp=-inf; wi=0;
        for k=1:K
           
            if trans{k}(1,1)+delta2(t-1,1)>temp
                temp=trans{k}(1,1)+delta2(t-1,1);
                wi=k;
            end
        end
             %[pb,ind]=max(trans{1:K}(1,1)+delta2(t-1,1));
             x=O(t,:);
             [va,ind]=max([Pr(l-1,t-1) temp]);
             delta2(t,1)=va+log(mixture(hmms{wi}.hmm.mix(1),x));
             if ind==1
                 belta(t,1)=t-1;
             else
                 belta(t,1)=belta(t-1,1);
             end
             %%遞歸
             for k=1:K
                  for j = 1:hmms{k}.hmm.N  %對該模型的所有狀態
                    
                 
                      [vm,vd]=max(delta2(t-1,:)+ trans{k}(:,j)');
                      x=O(t,:);
                     delta2(t,j)=vm+log(mixture(hmms{k}.hmm.mix(j),x));
                     belta(t,j)=belta(t-1,vd);
                  end 
                 
              P(l,t,k)=delta2(t,hmms{k}.hmm.N);
              B(l,t,k)=belta(t,hmms{k}.hmm.N); %保存幀號還是0??
             end  
             %%結束遞歸
    end
     [pm,q]=max(P(l,t,1:K));
      Pr(l,t)=pm;
      Br(l,t)=B(l,t,q);
      Wr(l,t)=q;
   
end

%  disp(delta2);

end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章