matlab baum welch,隐马尔可夫模型Baum-welch(前向-后向算法)程序)

function hmm = baum(hmm, samples)

mix  = hmm.mix;                        %高斯混合

N    = length(mix);                %HMM状态数

K    = length(samples);        %语音样本数

SIZE = size(samples(1).data,2); %参数阶数

%fprintf('canshujieshu:%d\n\n\n',SIZE);

% 计算前向, 后向概率矩阵, 考虑多观察序列和下溢问题

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(l)

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

%%%%    if denom == 0 denom =realmin;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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值