?? online_em_hmm_demo.m
字號:
% Example of online EM% Generative modelrand('state', 1);O = 3;T = 50;S = 2;prior0 = normalise(rand(S,1));transmat0 = mk_stochastic(rand(S,S));obsmat0 = mk_stochastic(rand(S,O));data = sample_dhmm(prior0, transmat0, obsmat0, T, 1);% Initial guess of paramsrand('state', 2); % different seed!transmat1 = mk_stochastic(rand(S,S));obsmat1 = mk_stochastic(rand(S,O));prior1 = normalise(rand(S,1));% Uniformative Dirichlet prior (expected sufficient statistics / pseudo counts)e = 0.001;ess_visits = repmat(e, S, 1);ess_trans = repmat(e, S, S);ess_emit = repmat(e, S, O);% Paramsw = 2;decay_sched = [0.1:0.1:0.9];dirichlet = e;% InitializeLL1 = zeros(1,T);t = 1;y = data(t);data_win = y;[prior1, LL1(1)] = normalise(prior1 .* obsmat1(:,y));% Iteratefor t=2:T y = data(t); if t <= w data_win = [data_win y]; else data_win = [data_win(2:end) y]; end d = decay_sched(min(t, length(decay_sched))); [prior1, transmat1, obsmat1, ess_visits, ess_trans, ess_emit, gamma, ll] = online_em(... prior1, transmat1, obsmat1, ess_visits, ess_trans, ess_emit, d, dirichlet, data_win); bel = gamma(:, end); LL1(t) = ll/length(data_win); %fprintf('t=%d, ll=%f\n', t, ll);endLL1(1) = LL1(2); % since initial likelihood is for 1 sliceplot(1:T, LL1, 'rx-');% compare with offline learningif 0rand('state', 2);transmat2 = mk_stochastic(rand(S,S));obsmat2 = mk_stochastic(rand(S,O));prior2 = normalise(rand(S,1));niter = 10;verbose = 1;[LL2, prior2, transmat2, obsmat2, gamma] = learn_hmm(data, prior2, transmat2, obsmat2, niter, thresh, verbose);LL2 = LL2 / T;endif 0% The following approach fails, because doing ML estimation of obsmat based on a short% window can result in 0s, which cannot be recovered fromniter = 1;thresh = 1e-2;verbose = 0;for t=2:T y = data(t); if t <= w data_win = [data_win y]; else data_win = [data_win(2:end) y]; end [LL, prior1, transmat1, obsmat1, gamma] = learn_hmm(data_win, prior1, transmat1, obsmat1, ... niter, thresh, verbose); bel = gamma(:, end);endend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -