⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 herbert.txt~

📁 利用HMM的方法的三种语音识别算法
💻 TXT~
字号:
function [LL, prior, transmat, obsmat, nrIterations] = ...   dhmm_em_Herbert(data, prior, transmat, obsmat, varargin)% Herbert's version of dhmm_em where the xi are not computed individually% but only their sum (over time) as xi_summed; this is the only way how they are used% and it saves a lot of memory.% LEARN_DHMM Find the ML/MAP parameters of an HMM with discrete outputs using EM.% [ll_trace, prior, transmat, obsmat, iterNr] = learn_dhmm(data, prior0, transmat0, obsmat0, ...)%% Notation: Q(t) = hidden state, Y(t) = observation%% INPUTS:% data{ex} or data(ex,:) if all sequences have the same length% prior(i)% transmat(i,j)% obsmat(i,o)%% Optional parameters may be passed as 'param_name', param_value pairs.% Parameter names are shown below; default values in [] - if none, argument is mandatory.%% 'max_iter' - max number of EM iterations [10]% 'thresh' - convergence threshold [1e-4]% 'verbose' - if 1, print out loglik at every iteration [1]% 'obs_prior_weight' - weight to apply to uniform dirichlet prior on observation matrix [0]%% To clamp some of the parameters, so learning does not change them:% 'adj_prior' - if 0, do not change prior [1]% 'adj_trans' - if 0, do not change transmat [1]% 'adj_obs' - if 0, do not change obsmat [1][max_iter, thresh, verbose, obs_prior_weight, adj_prior, adj_trans, adj_obs] = ...   process_options(varargin, 'max_iter', 10, 'thresh', 1e-4, 'verbose', 1, ...                   'obs_prior_weight', 0, 'adj_prior', 1, 'adj_trans', 1, 'adj_obs', 1);previous_loglik = -inf;loglik = 0;converged = 0;num_iter = 1;LL = [];if ~iscell(data) data = num2cell(data, 2); % each row gets its own cellendwhile (num_iter <= max_iter) & ~converged % E step [loglik, exp_num_trans, exp_num_visits1, exp_num_emit] = ...     compute_ess_dhmm(prior, transmat, obsmat, data, obs_prior_weight); % M step if adj_prior   prior = normalise(exp_num_visits1); end if adj_trans & ~isempty(exp_num_trans)   transmat = mk_stochastic(exp_num_trans); end if adj_obs   obsmat = mk_stochastic(exp_num_emit); end if verbose, fprintf(1, 'iteration %d, loglik = %f\n', num_iter, loglik); end num_iter =  num_iter + 1; converged = em_converged(loglik, previous_loglik, thresh); previous_loglik = loglik; LL = [LL loglik];endnrIterations = num_iter - 1;%%%%%%%%%%%%%%%%%%%%%%%function [loglik, exp_num_trans, exp_num_visits1, exp_num_emit, exp_num_visitsT] = ...   compute_ess_dhmm(startprob, transmat, obsmat, data, dirichlet)% COMPUTE_ESS_DHMM Compute the Expected Sufficient Statistics for an HMM with discrete outputs% function [loglik, exp_num_trans, exp_num_visits1, exp_num_emit, exp_num_visitsT] = ...%    compute_ess_dhmm(startprob, transmat, obsmat, data, dirichlet)%% INPUTS:% startprob(i)% transmat(i,j)% obsmat(i,o)% data{seq}(t)% dirichlet - weighting term for uniform dirichlet prior on expected emissions%% OUTPUTS:% exp_num_trans(i,j) = sum_l sum_{t=2}^T Pr(X(t-1) = i, X(t) = j| Obs(l))% exp_num_visits1(i) = sum_l Pr(X(1)=i | Obs(l))% exp_num_visitsT(i) = sum_l Pr(X(T)=i | Obs(l))% exp_num_emit(i,o) = sum_l sum_{t=1}^T Pr(X(t) = i, O(t)=o| Obs(l))% where Obs(l) = O_1 .. O_T for sequence l.numex = length(data);[S O] = size(obsmat);exp_num_trans = zeros(S,S);exp_num_visits1 = zeros(S,1);exp_num_visitsT = zeros(S,1);exp_num_emit = dirichlet*ones(S,O);loglik = 0;for ex=1:numex obs = data{ex}; T = length(obs); %obslik = eval_pdf_cond_multinomial(obs, obsmat); obslik = multinomial_prob(obs, obsmat); [alpha, beta, gamma, current_ll, xi_summed] = fwdback_Herbert(startprob, transmat, obslik); loglik = loglik +  current_ll; exp_num_trans = exp_num_trans + xi_summed; exp_num_visits1 = exp_num_visits1 + gamma(:,1); exp_num_visitsT = exp_num_visitsT + gamma(:,T); % loop over whichever is shorter if T < O   for t=1:T     o = obs(t);     exp_num_emit(:,o) = exp_num_emit(:,o) + gamma(:,t);   end else   for o=1:O     ndx = find(obs==o);     if ~isempty(ndx)       exp_num_emit(:,o) = exp_num_emit(:,o) + sum(gamma(:, ndx), 2);     end   end endendfunction [alpha, beta, gamma, loglik, xi_summed, gamma2] = fwdback_Herbert(init_state_distrib, ...   transmat, obslik, varargin)% FWDBACK Compute the posterior probs. in an HMM using the forwards backwards algo.%% [alpha, beta, gamma, loglik, xi, gamma2] = fwdback(init_state_distrib, transmat, obslik, ...)%% Notation:% Y(t) = observation, Q(t) = hidden state, M(t) = mixture variable (for MOG outputs)% A(t) = discrete input (action) (for POMDP models)%% INPUT:% init_state_distrib(i) = Pr(Q(1) = i)% transmat(i,j) = Pr(Q(t) = j | Q(t-1)=i)%  or transmat{a}(i,j) = Pr(Q(t) = j | Q(t-1)=i, A(t-1)=a) if there are discrete inputs% obslik(i,t) = Pr(Y(t)| Q(t)=i)%   (Compute obslik using eval_pdf_xxx on your data sequence first.)%% Optional parameters may be passed as 'param_name', param_value pairs.% Parameter names are shown below; default values in [] - if none, argument is mandatory.%% For HMMs with MOG outputs: if you want to compute gamma2, you must specify% 'obslik2' - obslik(i,j,t) = Pr(Y(t)| Q(t)=i,M(t)=j)  []% 'mixmat' - mixmat(i,j) = Pr(M(t) = j | Q(t)=i)  []%% For HMMs with discrete inputs:% 'act' - act(t) = action performed at step t%% Optional arguments:% 'fwd_only' - if 1, only do a forwards pass and set beta=[], gamma2=[]  [0]% 'scaled' - if 1,  normalize alphas and betas to prevent underflow [1]% 'maximize' - if 1, use max-product instead of sum-product [0]%% OUTPUTS:% alpha(i,t) = p(Q(t)=i | y(1:t)) (or p(Q(t)=i, y(1:t)) if scaled=0)% beta(i,t) = p(y(t+1:T) | Q(t)=i)*p(y(t+1:T)|y(1:t)) (or p(y(t+1:T) | Q(t)=i) if scaled=0)% gamma(i,t) = p(Q(t)=i | y(1:T))% loglik = log p(y(1:T))% xi(i,j,t-1)  = p(Q(t-1)=i, Q(t)=j | y(1:T))% gamma2(j,k,t) = p(Q(t)=j, M(t)=k | y(1:T)) (only for MOG  outputs)%% If fwd_only = 1, these become% alpha(i,t) = p(Q(t)=i | y(1:t))% beta = []% gamma(i,t) = p(Q(t)=i | y(1:t))% xi(i,j,t-1)  = p(Q(t-1)=i, Q(t)=j | y(1:t))% gamma2 = []%% Note: we only compute xi if it is requested as a return argument, since it can be very large.% Similarly, we only compute gamma2 on request (and if using MOG outputs).%% Examples:%% [alpha, beta, gamma, loglik] = fwdback(pi, A, multinomial_prob(sequence, B));%% [B, B2] = mixgauss_prob(data, mu, Sigma, mixmat);% [alpha, beta, gamma, loglik, xi, gamma2] = fwdback(pi, A, B, 'obslik2', B2, 'mixmat', mixmat);if nargout >= 5, compute_xi = 1; else compute_xi = 0; endif nargout >= 6, compute_gamma2 = 1; else compute_gamma2 = 0; end[obslik2, mixmat, fwd_only, scaled, act, maximize, compute_xi, compute_gamma2] = ...   process_options(varargin, ...       'obslik2', [], 'mixmat', [], ...       'fwd_only', 0, 'scaled', 1, 'act', [], 'maximize', 0, ...                   'compute_xi', compute_xi, 'compute_gamma2', compute_gamma2);[Q T] = size(obslik);if isempty(obslik2) compute_gamma2 = 0;endif isempty(act) act = ones(1,T); transmat = { transmat } ;endscale = ones(1,T);% scale(t) = Pr(O(t) | O(1:t-1)) = 1/c(t) as defined by Rabiner (1989).% Hence prod_t scale(t) = Pr(O(1)) Pr(O(2)|O(1)) Pr(O(3) | O(1:2)) ... = Pr(O(1), ... ,O(T))% or log P = sum_t log scale(t).% Rabiner suggests multiplying beta(t) by scale(t), but we can instead% normalise beta(t) - the constants will cancel when we compute gamma.loglik = 0;alpha = zeros(Q,T);gamma = zeros(Q,T);if compute_xi xi_summed = zeros(Q,Q);else xi_summed = [];end%%%%%%%%% Forwards %%%%%%%%%%t = 1;alpha(:,1) = init_state_distrib(:) .* obslik(:,t);if scaled %[alpha(:,t), scale(t)] = normaliseC(alpha(:,t)); [alpha(:,t), scale(t)] = normalise(alpha(:,t));endassert(approxeq(sum(alpha(:,t)),1))for t=2:T %trans = transmat(:,:,act(t-1))'; trans = transmat{act(t-1)}; if maximize   m = max_mult(trans', alpha(:,t-1));   %A = repmat(alpha(:,t-1), [1 Q]);   %m = max(trans .* A, [], 1); else   m = trans' * alpha(:,t-1); end alpha(:,t) = m(:) .* obslik(:,t); if scaled   %[alpha(:,t), scale(t)] = normaliseC(alpha(:,t));   [alpha(:,t), scale(t)] = normalise(alpha(:,t)); end if compute_xi & fwd_only  % useful for online EM   %xi(:,:,t-1) = normaliseC((alpha(:,t-1) * obslik(:,t)') .* trans);   xi_summed = xi_summed + normalise((alpha(:,t-1) * obslik(:,t)') .* trans); end assert(approxeq(sum(alpha(:,t)),1))endif scaled if any(scale==0)   loglik = -inf; else   loglik = sum(log(scale)); endelse loglik = log(sum(alpha(:,T)));endif fwd_only gamma = alpha; beta = []; gamma2 = []; return;end%%%%%%%%% Backwards %%%%%%%%%%beta = zeros(Q,T);if compute_gamma2 M = size(mixmat, 2); gamma2 = zeros(Q,M,T);else gamma2 = [];endbeta(:,T) = ones(Q,1);%gamma(:,T) = normaliseC(alpha(:,T) .* beta(:,T));gamma(:,T) = normalise(alpha(:,T) .* beta(:,T));t=T;if compute_gamma2 denom = obslik(:,t) + (obslik(:,t)==0); % replace 0s with 1s before dividing gamma2(:,:,t) = obslik2(:,:,t) .* mixmat .* repmat(gamma(:,t), [1 M]) ./ repmat(denom, [1 M]); %gamma2(:,:,t) = normaliseC(obslik2(:,:,t) .* mixmat .* repmat(gamma(:,t), [1 M])); % wrong!endfor t=T-1:-1:1 b = beta(:,t+1) .* obslik(:,t+1); %trans = transmat(:,:,act(t)); trans = transmat{act(t)}; if maximize   B = repmat(b(:)', Q, 1);   beta(:,t) = max(trans .* B, [], 2); else   beta(:,t) = trans * b; end if scaled   %beta(:,t) = normaliseC(beta(:,t));   beta(:,t) = normalise(beta(:,t)); end %gamma(:,t) = normaliseC(alpha(:,t) .* beta(:,t)); gamma(:,t) = normalise(alpha(:,t) .* beta(:,t)); if compute_xi   %xi(:,:,t) = normaliseC((trans .* (alpha(:,t) * b')));   xi_summed = xi_summed + normalise((trans .* (alpha(:,t) * b'))); end if compute_gamma2   denom = obslik(:,t) + (obslik(:,t)==0); % replace 0s with 1s before dividing   gamma2(:,:,t) = obslik2(:,:,t) .* mixmat .* repmat(gamma(:,t), [1 M]) ./ repmat(denom, [1 M]);   %gamma2(:,:,t) = normaliseC(obslik2(:,:,t) .* mixmat .* repmat(gamma(:,t), [1 M])); endend% We now explain the equation for gamma2% Let zt=y(1:t-1,t+1:T) be all observations except y(t)% gamma2(Q,M,t) = P(Qt,Mt|yt,zt) = P(yt|Qt,Mt,zt) P(Qt,Mt|zt) / P(yt|zt)%                = P(yt|Qt,Mt) P(Mt|Qt) P(Qt|zt) / P(yt|zt)% Now gamma(Q,t) = P(Qt|yt,zt) = P(yt|Qt) P(Qt|zt) / P(yt|zt)% hence% P(Qt,Mt|yt,zt) = P(yt|Qt,Mt) P(Mt|Qt) [P(Qt|yt,zt) P(yt|zt) / P(yt|Qt)] / P(yt|zt)%                = P(yt|Qt,Mt) P(Mt|Qt) P(Qt|yt,zt) / P(yt|Qt)%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -