📄 emgmm.html
字号:
<span class=keyword>if</span> ~isfield( options, <span class=quotes>'init'</span>), options.init = <span class=quotes>'random'</span>; <span class=keyword>end</span><br><span class=keyword>if</span> ~isfield( options, <span class=quotes>'verb'</span>), options.verb = 0; <span class=keyword>end</span><br><br>[dim,num_data] = size(X);<br><br><span class=comment>% setup initial model </span><br><span class=comment>% ---------------------------------</span><br><br><span class=keyword>if</span> <span class=stack>nargin</span> == 3,<br><br> <span class=comment>% take model from input</span><br> <span class=comment>%-----------------------------</span><br><br> model = init_model; <br> <span class=keyword>if</span> ~isfield(model,<span class=quotes>'t'</span>), model.t = 0; <span class=keyword>end</span><br> <span class=keyword>if</span> ~isfield(model,<span class=quotes>'Alpha'</span>), <br> model.Alpha=-inf*ones(options.num_gauss,num_data);<br> <span class=keyword>end</span><br> <span class=keyword>if</span> ~isfield(model,<span class=quotes>'logL'</span>), model.logL=-inf; <span class=keyword>end</span><br><span class=keyword>else</span><br> <br> <span class=comment>% compute initial model</span><br> <span class=comment>%------------------------------------</span><br> <span class=keyword>switch</span> options.init,<br> <span class=comment>% random model</span><br> <span class=label>case</span> <span class=quotes>'random'</span> <br> <span class=comment>% takes randomly first num_gauss trn. vectors as mean vectors</span><br> inx = randperm(num_data); <br> inx=inx(1:options.ncomp);<br> centers_X = X(:,inx);<br> <br> <span class=comment>% K-means clustering</span><br> <span class=label>case</span> <span class=quotes>'kmeans'</span><br> tmp = kmeans( X, options.ncomp );<br> centers_X = tmp.X;<br><br> <span class=label>otherwise</span><br> <span class=error>error</span>(<span class=quotes>'Unknown initialization method.'</span>);<br> <span class=keyword>end</span><br><br> knn = knnrule({<span class=quotes>'X'</span>,centers_X,<span class=quotes>'y'</span>,[1:options.ncomp]},1);<br> y = knnclass(X,knn);<br><br> <span class=comment>% uses ML estimation of complete data</span><br> model = mlcgmm( {<span class=quotes>'X'</span>,X,<span class=quotes>'y'</span>,y}, options.cov_type );<br><br> model.Alpha = zeros(options.ncomp,num_data);<br> <span class=keyword>for</span> i = 1:options.ncomp,<br> model.Alpha(i,find(y==i)) = 1;<br> <span class=keyword>end</span><br> model.logL= -inf;<br> model.t = 1;<br> model.options = options;<br> model.fun = <span class=quotes>'pdfgmm'</span>;<br> <br><span class=keyword>end</span><br><br><br><span class=comment>% Main loop of EM algorithm </span><br><span class=comment>% -------------------------------------</span><br>model.exitflag = 0;<br><span class=keyword>while</span> model.exitflag == 0 & model.t < options.tmax,<br><br> <span class=comment>% counter of iterations</span><br> model.t = model.t + 1;<br> <br> <span class=comment>%----------------------------------------------------</span><br> <span class=comment>% E-Step</span><br> <span class=comment>% The distribution of hidden states is computed based</span><br> <span class=comment>% on the current estimate.</span><br> <span class=comment>%----------------------------------------------------</span><br><br> newAlpha = (model.Prior(:)*ones(1,num_data)).*pdfgauss(X, model);<br> newLogL = sum(log(sum(newAlpha,1))); <br> newAlpha = newAlpha./(ones(options.ncomp,1)*sum(newAlpha,1));<br><br> <span class=comment>%------------------------------------------------------</span><br> <span class=comment>% Stopping conditions.</span><br> <span class=comment>%------------------------------------------------------</span><br> <br> <span class=comment>% 1) change in distribution of hidden state Alpha</span><br> model.delta_alpha = sum(sum((model.Alpha - newAlpha).^2));<br> <br> <span class=comment>% 2) change in log-Likelihood</span><br> model.delta_logL = newLogL - model.logL(<span class=keyword>end</span>);<br> model.logL = [model.logL newLogL];<br> <br> <span class=keyword>if</span> options.verb,<br> <span class=io>fprintf</span>(<span class=quotes>'%d: logL=%f, delta_logL=%f, delta_alpha=%f\n'</span>,...<br> model.t, model.logL(<span class=keyword>end</span>), model.delta_logL, model.delta_alpha );<br> <span class=keyword>end</span><br><br> <span class=keyword>if</span> options.eps_logL >= model.delta_logL,<br> model.exitflag = 1;<br> <span class=keyword>elseif</span> options.eps_alpha >= model.delta_alpha,<br> model.exitflag = 2;<br> <span class=keyword>else</span><br><br> model.Alpha = newAlpha;<br> <br> <span class=comment>%----------------------------------------------------</span><br> <span class=comment>% M-Step</span><br> <span class=comment>% The new parameters maximizing expectation of </span><br> <span class=comment>% log-likelihood are computed.</span><br> <span class=comment>%----------------------------------------------------</span><br><br> tmp_model = melgmm(X,model.Alpha,options.cov_type);<br> <br> model.Mean = tmp_model.Mean;<br> model.Cov = tmp_model.Cov;<br> model.Prior = tmp_model.Prior;<br> <br> <span class=keyword>end</span><br><span class=keyword>end</span> <span class=comment>% while main loop</span><br><br><span class=jump>return</span>;<br><br><br></code>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -