www.pudn.com > hmm--matlab.rar > getparam.asv


function param = getparam(hmm,O) 
%给定输出序列O,计算前向概率alpha,后向概率beta,标定系数c,及ksai,gama 
%输入: 
% hmm--HMM模型参数 
% O--n*d观察序列 
% 输出: 
% param--包含各种参数的结构 
 
T = size(O,1); %序列的长度 
 
init = hmm.init; %初始概率 
trans = hmm.trans; %转移概率 
mix = hmm.mix;  %高阶混合 
N = hmm.N;  %HMM的状态数 
 
%给的观察序列O,计算前向概率alpha 
alpha = zeros(T,N); 
 
%t=1的前向概率 
x = O(1,1); 
for l=1:N 
    alpha(1,l) = init(l)*mixture(mix(l),x); 
end 
 
%标定t=1的前向概率 
c = zeros(T,1); 
c(1) = 1/sum(alpha(1,:)); 
alpha(1,:) = c(1)*alpha(1,:); 
 
%t=2:T的前向概率和标定 
for t = 2:T 
    for i = 1:N 
        temp = 0; 
        for j =1:N 
            temp = temp+alpha(t-1,j)*trans(j,i); 
        end 
        alpha(t,i) = temp*mixture(mix(i),O(t,:)); 
    end 
    c(t) = 1/sum(alpha(t,:)); 
    alpha(t,:) = c(t)*alpha(t,:); 
end 
 
%给定观测序列O,计算后向概率及标定 
beta = zeros(T,N); 
 
%t=T的后向概率及标定 
for l=1:N 
    beta(T,l) = c(T); 
end 
 
%t=T-1:1的后向概率和标定 
for t = T-1:-1:1 
    x = O(t+1,:); 
    for i =1:N 
        for j=1:N 
            beta(t,i) = beta(t,i)+beta(t+1,j)*mixture(mix(j),x)*trans(i,j); 
        end 
    end 
    beta(t,:) = c(t)*beta(t,:); 
end 
 
%过渡概率ksai 
ksai = zeros(T-1,N,N) 
for t=1:T-1 
    denom = sum(alpha(t,:).*beta(t,:)); 
    for i=1:N-1 
        for j=i:i+1 
            nom = alpha(t,i)*trans(i,j)*mixture(mix(j),O(t+1,:))*beta(t+1,j); 
            ksai(t,i,j) = c(t)*nom/denom; 
        end 
    end 
end 
 
%混合输出概率:gama 
gama = zeros(T,N,max(hmm.M)); 
for t = 1:T 
    pab = zeros(N,1); 
    for l = 1:N 
        pab(l) = alpha(t,l)*beta(t,l); 
    end 
    x = O(t,:); 
    for l=1:N 
        tmp = pab(l)/sum(pab); 
        prob = zeros(mix(l).M,1); 
        for j=1:mix(l).M 
            m = mix(l).mean(j,:); 
            v = mix(l).var(j,:); 
            prob(j) = mix(l).weight(j)*pdf(m,v,x); 
        end 
        for j=1:mix(l).M 
            gama(t,l,j) = tmp*prob(j)/sum(prob); 
        end 
    end 
end 
 
param.c = c; 
param.alpha = alpha; 
param.beta = beta; 
param.ksai = ksai; 
param.gama = gama;