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

📄 online_em.m

📁 隐马尔科夫模型对文本信息进行抽取利用MATLAB实现
💻 M
字号:
function [prior, transmat, obsmat, exp_num_visits, exp_num_trans, exp_num_emit, gamma, ll] = online_em(...    prior, transmat, obsmat, exp_num_visits, exp_num_trans, exp_num_emit, decay, dirichlet, data, ...    act, adj_prior, adj_trans, adj_obs)% ONLINE_EM Adjust the parameters using a weighted combination of the old and new expected statistics%% [prior, transmat, obsmat, exp_num_visits, exp_num_trans, exp_num_emit, gamma, ll] = online_em(...%    prior, transmat, obsmat, exp_num_visits, exp_num_trans, exp_num_emit, decay, dirichlet, data, ...%    act, adj_prior, adj_trans, adj_obs)% % 0 < decay < 1, with smaller values meaning the past is forgotten more quickly.% (We need to decay the old ess, since they were based on out-of-date parameters.)% The other params are as in learn_hmm.% We do a single forwards-backwards pass on the provided data.if ~exist('act'), act = []; endif ~exist('adj_prior'), adj_prior = 1; endif ~exist('adj_trans'), adj_trans = 1; endif ~exist('adj_obs'), adj_obs = 1; end% E stepolikseq = mk_dhmm_obs_lik(data, obsmat);if isempty(act)  [alpha, beta, gamma, xi, ll] = forwards_backwards(prior, transmat, olikseq);else  [alpha, beta, gamma, xi, ll] = forwards_backwards(prior, transmat, olikseq, [], [], act);end% Increment ESSexp_num_visits = decay*exp_num_visits + sum(gamma, 2);[S O] = size(obsmat);exp_num_emit = decay*exp_num_emit + dirichlet*ones(S,O);T = length(data);if T < O  for t=1:T    o = data(t);    exp_num_emit(:,o) = exp_num_emit(:,o) + gamma(:,t);  endelse  for o=1:O    ndx = find(data==o);    if ~isempty(ndx)      exp_num_emit(:,o) = exp_num_emit(:,o) + sum(gamma(:, ndx), 2);    end  endendif T > 1  if isempty(act)    exp_num_trans = decay*exp_num_trans + sum(xi,3);  else    % act(2) determines Q(2), xi(:,:,1) holds P(Q(1), Q(2))    A = length(transmat);    for a=1:A      ndx = find(act(2:end)==a);      if ~isempty(ndx)	exp_num_trans{a} = decay*exp_num_trans{a} + sum(xi(:,:,ndx), 3);      end    end  endend% M step% If a param is non-adjustable, we needn't have computed its essif adj_prior  prior = normalise(exp_num_visits);endif adj_obs  obsmat = mk_stochastic(exp_num_emit);endif adj_trans & (T>1)  if isempty(act)    transmat = mk_stochastic(exp_num_trans);  else    for a=1:A      transmat{a} = mk_stochastic(exp_num_trans{a});    end  endend

⌨️ 快捷键说明

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