www.pudn.com > hmm--matlab.rar > baum.m


function hmm = baum(hmm,samples) 
 
mix = hmm.mix;  %高斯混合 
N = length(mix);  %HMM状态数 
K = length(samples);  %语音样本数 
SIZE = size(samples(1).data,2);  %参数阶数 
 
%计算前向,后向概率矩阵,考虑多观察序列和下溢问题 
disp('计算样本参数……') 
for k = 1:K 
    fprintf('%d',k) 
    param(k) = getparam(hmm,samples(k).data); 
end 
fprintf('\n') 
 
%重估转移概率矩阵A:trans 
disp('重估转移概率矩阵A……') 
for i = 1:N-1 
    denom = 0; 
    for k=1:K 
        tmp = param(k).ksai(:,i,:); 
        denom = denom+sum(tmp(:)); 
    end 
    for j=i:i+1 
        nom = 0; 
        for k=1:K 
            tmp = param(k).ksai(:,i,j); 
            nom = nom +sum(tmp(:)); 
        end 
        hmm.trans(i,j) = nom/denom; 
    end 
end 
 
%重估混合高斯的参数 
disp('重估混合高斯的参数……') 
for l=1:N 
    for j=1:hmm.M(1) 
        fprintf('%d,%d',l,j) 
         
        %计算各pdf的均值和方差 
        nommean = zeros(1,SIZE); 
        nomvar = zeros(1,SIZE); 
        denom = 0; 
        for k =1:K 
            T = size(samples(k).data,1); 
            for t=1:T 
                x = samples(k).data(t,:); 
                nommean = nommean+param(k).gama(t,l,j)*x; 
                nomvar = nomvar+param(k).gama(t,l,j)*(x-mix(l).mean(j,:)).^2; 
                denom = denom+param(k).gama(t,l,j); 
            end 
        end 
        hmm.mix(l).mean(j,:) = nommean/denom; 
        hmm.mix(l).var(j,:) = nomvar/denom; 
         
        %计算各pdf的权 
        nom = 0; 
        denom = 0; 
        for k =1:K 
            tmp = param(k).gama(:,l,j); 
            nom = nom+sum(tmp(:)); 
            tmp = param(k).gama(:,l,:); 
            denom = denom+sum(tmp(:)); 
        end 
        hmm.mix(l).weight(j) = nom/denom; 
    end 
    fprintf('\n'); 
end