www.pudn.com > asr.rar > HMMTRN.M, change:2004-11-06,size:1741b
function [a,b,pai,lrncrv]=hmmtrn(trnset,N,M,LRmodel)
%% HMM Model Training
%%
%% [a,b,pai,lrncrv] = hmmtrn(trnset,N,M,LRmodel)
%%
%% a,b,pai --- HMM parameters
%% lrncrv --- learning curve for re-estimation
%% trnset --- training set
%% N --- number of states
%% M --- number of possible observation symbols
%% LRmodel --- left-right model flag
%%
%% initialize a's, b's, and pai's
[a,b,pai] = rndmpara(N,M,LRmodel);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Re-estimation Procedure for multiple training seq.%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
no_of_trnptn=size(trnset,2);
avgT=nnz(trnset)/no_of_trnptn;
threshold=0.00001;
cnt=0;
flag=1;
while(flag)
cnt=cnt+1;
old_a=a;
old_b=b;
old_pai=pai;
acc_na=zeros(N,N);
acc_da=zeros(N,1);
acc_nb=zeros(M,N);
acc_db=zeros(N,1);
acc_npai=zeros(N,1);
acc_dpai=zeros(1,1);
for i=1:no_of_trnptn
T=nnz(trnset(:,i));
[alpha,ct,p]=forward(trnset(1:T,i),a,b,pai);
beta = backward(trnset(1:T,i),a,b,ct);
[na,da,nb,db,npai,dpai]=baumwlch(alpha,beta,ct,a,b,trnset(1:T,i));
acc_na=acc_na+na;
acc_da=acc_da+da;
acc_nb=acc_nb+nb;
acc_db=acc_db+db;
acc_npai = acc_npai + npai / (ct(1)^2);
acc_dpai = acc_dpai + dpai / (ct(1)^2);
end
acc_da = 1 ./ acc_da;
acc_db = 1 ./ acc_db;
acc_dpai = 1 / acc_dpai;
pai = acc_npai * acc_dpai;
for i=1:N
a(i,:) = acc_na(i,:) * acc_da(i);
b(:,i) = acc_nb(:,i) * acc_db(i);
end
%% compute statistical distance between new and old
%% parameters
lrncrv(cnt) = statdist(a,b,pai,old_a,old_b,old_pai,avgT)
if(abs(lrncrv(cnt)) threshold)
flag =0;
end
end
return