我正在尝试学习HMM GMM实现并创建一个简单的模型来检测某些声音(动物调用等)。
我正在尝试在MATLAB中使用GMM(高斯混合)训练HMM(隐马尔可夫模型)网络。
我有几个问题,我无法找到任何有关的信息。
1)是否应在每个HMM状态的循环中调用 mhmm_em()
函数,否则会自动完成?
如:
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);
最后一个参数,应该是高斯数还是number_of_states-1?
3)如果我们正在寻找最大可能性,那么维特比在哪里发挥作用?
如果我想用我提取的声学特征向量训练我的模型后想要检测某种类型的动物/人类呼叫,我是否还需要在测试模式下使用维特比算法?
我有点困惑,我非常感谢这部分的解释。
对于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);
答案 0 :(得分:1)
1)不,EM在用kmeans初始化之后估计整个模型。它不会单独估计状态。
2)你的代码中的最后一个参数都不是'max_iter'的值,它是EM的迭代次数。通常它是6左右的东西。它不应该是M。
3)是的,你需要在测试模式下使用Viterbi。