MATLAB Murphy的HMM工具箱

7

我正在尝试学习HMM GMM实现,并创建了一个简单的模型来检测某些特定的声音(动物叫声等)。

我正在尝试在MATLAB中使用GMM(高斯混合)训练HMM(隐马尔科夫模型)网络。

我有一些问题,我找不到任何相关信息。

1) mhmm_em() 函数是否应该针对每个HMM状态进行循环调用,还是自动完成?

例如:

 for each state
        Initialize GMM’s and get parameters (use mixgauss_init.m)
    end
    Train HMM with EM (use mhmm_em.m)

2)

[LL, prior1, transmat1, mu1, Sigma1, mixmat1] = ...
                            mhmm_em(MFCCs, prior0, transmat0, mu0, Sigma0, mixmat0, 'max_iter', M);

最后一个参数,应该是高斯函数的数量还是状态数减一?
如果我们正在寻找最大似然,那么维特比算法在哪里发挥作用?
假设我想要在使用提取出来的声学特征向量训练模型之后检测某种类型的动物/人类呼叫,那么在测试模式下,我仍然需要使用维特比算法吗?
这部分内容有点让我困惑,我非常感谢对此部分的解释。
任何关于HMM GMM逻辑方面的代码评论也将不胜感激。
谢谢
这是我的MATLAB例程;
O = 21;            % Number of coefficients in a vector(coefficient)
M = 10;            % Number of Gaussian mixtures
Q = 3;             % Number of states (left to right)
%  MFCC Parameters
Tw = 128;           % analysis frame duration (ms)
Ts = 64;           % analysis frame shift (ms)
alpha = 0.95;      % preemphasis coefficient
R = [ 1 1000 ];    % frequency range to consider
f_bank = 20;       % number of filterbank channels 
C = 21;            % number of cepstral coefficients
L = 22;            % cepstral sine lifter parameter(?)

%Training
[speech, fs, nbits ] = wavread('Train.wav');
[MFCCs, FBEs, frames ] = mfcc( speech, fs, Tw, Ts, alpha, hamming, R, f_bank, C, L );
cov_type = 'full'; %the covariance type that is chosen as ҦullҠfor gaussians.
prior0 = normalise(rand(Q,1));
transmat0 = mk_stochastic(rand(Q,Q));
[mu0, Sigma0] = mixgauss_init(Q*M, dat, cov_type, 'kmeans');

mu0 = reshape(mu0, [O Q M]);
Sigma0 = reshape(Sigma0, [O O Q M]);
mixmat0 = mk_stochastic(rand(Q,M));
[LL, prior1, transmat1, mu1, Sigma1, mixmat1] = ...
mhmm_em(MFCCs, prior0, transmat0, mu0, Sigma0, mixmat0, 'max_iter', M);

%Testing
for i = 1:length(filelist)
  fprintf('Processing %s\n', filelist(i).name);
  [speech_tst, fs, nbits ] = wavread(filelist(i).name);
  [MFCCs, FBEs, frames ] = ...
   mfcc( speech_tst, fs, Tw, Ts, alpha, hamming, R, f_bank, C, L);
  loglik(i) = mhmm_logprob( MFCCs,prior1, transmat1, mu1, Sigma1, mixmat1);
end;
[Winner, Winner_idx] = max(loglik);
1个回答

1

1) 不,EM在你用kmeans初始化之后会整体估计模型。它不会分别估计状态。

2) 也不是,你代码中的最后一个参数是'max_iter'的值,它是EM的迭代次数。通常是6左右。它不应该是M。

3) 是的,在测试模式下需要使用Viterbi。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接