📄 demo_emgmm.m
字号:
function demo_emgmm(action,hfigure,varargin)% DEMO_EMGMM Demo on Expectation-Maximization (EM) algorithm.%% Synopsis:% demo_emgmm%% Description:% This demo shows the Expectation-Maximization (EM) algorithm% [Schles68][DLR77] for Gaussians mixture model (GMM). The EM % fits the GMM to i.i.d. sample data (in this case only 2D) % such that the likelihood is maximized. %% The found model is described by ellipsoids (shape of % covariances) and a crosses (mean value vectors). The value% of the optimized log-likelihood function for the current estimate % is displayed in the bottom part.%% Control:% Covariance - Determines type of the covariance matrix:% Diagonal (independent features),% Full (correlated features).% Components - Number of components (Gaussians) in the mixture.% % Iterations - Number of iterations in one step.% Random init - the initial model is randomly generated and/or % first n training samples are taken as the% mean vectors.%% FIG2EPS - Export screen to the PostScript file.% Save model - Save current model to file.% Load data - Load input point sets from file.% Create data - Invoke program for creating point sets.% Reset - Set the tested algorithm to the initial state.% Play - Run the tested algorithm.% Stop - Stop the running algorithm.% Step - Perform only one step.% Info - Info box.% Close - Close the program.%% See also EMGMM.%% About: Statistical Pattern Recognition Toolbox% (C) 1999-2003, Written by Vojtech Franc and Vaclav Hlavac% <a href="http://www.cvut.cz">Czech Technical University Prague</a>% <a href="http://www.feld.cvut.cz">Faculty of Electrical Engineering</a>% <a href="http://cmp.felk.cvut.cz">Center for Machine Perception</a>% Modifications:% 19-sep-2003, VF% 11-june-2001, V.Franc, comments added.% 27.02.00 V. Franc% 5. 4.00 V. Franc% 23.06.00 V. Hlavac Comments polished. Message when no data loaded.% Export of the solution to global variables.% 27-mar-2001, V.Franc, Graph og log-likelihood function added% Used functions: PPOINTS, PNMIX% == Global variables, used to export results from demo_emgmm ========global UNSU_MI % K vectors with mean valuesglobal UNSU_SIGMA % K covariance matricesglobal UNSU_PK % K apriori probabilities for each distributions.%global UNSU_eI % Used only by the next iteration, not globalisedglobal UNSU_solution % 1 if alg. finished in stationary point, 0 otherwiseglobal UNSU_t % Number of iterations the algorithm performed% == Constants =====================================================AXIST_ADD=10;AXISY_ADD=5;BORDER=0.25; % space betwean window outer and the points
CENTERSIZE=10; % size of center point
LINE_WIDTH=1;
AXIST_ADD=10;
DATA_IDENT='Finite sets, enumeration'; % file identifier
randinit=1;
if nargin < 1,
action = 'initialize';
end
% What action is required ?
switch lower(action)
case 'initialize'
% == Initialize user interface control and figure window ================
% == Figure % =============================================================
left=0.2; width=0.6; bottom=0.1; height=0.8; hfigure=figure('Name','EM algorithm', ... 'Visible','off',... 'NumberTitle','off', ... 'Units','normalized', ... 'Position',[left bottom width height],... 'tag','demo_emgmm',... 'doublebuffer','on',... 'backingstore','off'); % == Axes =============================================================== left=0.1; width=0.65; bottom=0.45; height=0.5; haxes1=axes(... 'Units','normalized', ... 'NextPlot','add',... 'UserData',[],... 'Position',[left bottom width height]); xlabel('feature x\_1'); ylabel('feature x\_2'); htitle1=title('No data loaded',...
'VerticalAlignment','bottom',...
'Parent',haxes1,... 'HorizontalAlignment','left',...
'Units','normalized',...
'Position',[0 1 0]);
% axes log-Likelihood graph left=0.1; width=0.65; bottom=0.1; height=0.25; haxes2=axes(... 'Units','normalized', ... 'NextPlot','add',... 'Position',[left bottom width height]); ylabel('logL(t)'); htitle2=title('Log-likelihood function',... 'Parent',haxes2,... 'VerticalAlignment','bottom',... 'Units','normalized',... 'HorizontalAlignment','left',... 'Position',[0 1 0]); htxsteps=xlabel('step number t=0'); % == Comment Window frame ==============================================
%% bottom=0.05;
%% height=0.16;
%% uicontrol( ...
%% 'Style','frame', ...
%% 'Units','normalized', ...
%% 'Position',[left bottom width height], ...
%% 'BackgroundColor',[0.5 0.5 0.5]);
% Text label
% uicontrol( ...
% 'Style','text', ...
% 'Units','normalized', ...
% 'Position',[left height-0.01 width 0.05], ...
% 'BackgroundColor',[0.5 0.5 0.5], ...
% 'ForegroundColor',[1 1 1], ...
% 'String','Comment Window');
% Edit window
%% border=0.01;
%% hconsole=uicontrol( ...
%% 'Style','edit', ...
%% 'HorizontalAlignment','left', ...
%% 'Units','normalized', ...
%% 'Max',10, ...
%% 'BackgroundColor',[1 1 1], ...
%% 'Position',[left+border bottom width-2*border height-0.05], ...
%% 'Enable','inactive',...
%% 'String','');
% == Buttons ===========================================================
% -- Export to EPS ---------
width=0.1;
left=0.75-width;
bottom=0.95;
height=0.04;
hbtclose = uicontrol(...
'Units','Normalized', ...
'Callback','fig2eps(gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','FIG2EPS');
%----------------------------------
% Close button
left=0.8;
bottom=0.05;
height=0.044;
width=0.15;
hbtclose = uicontrol(...
'Units','Normalized', ...
'Callback','close(gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Close');
% Info button: call stanard info box
bottom=bottom+1.5*height;
hbtinfo = uicontrol(...
'Units','Normalized', ...
'Callback','demo_emgmm(''info'',gcf)',...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Info');
% Step button: perform one adaptation step
bottom=bottom+1.5*height;
hbtstep = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Step', ...
'Interruptible','off',...
'Callback','demo_emgmm(''step'',gcf)');
% Stop button: stop process of adaptation
bottom=bottom+height; hbtstop = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ... 'String','Stop', ...
'Callback','set(gcbo,''UserData'',1)',... 'Enable','off');
% Play button: begin adaptation
bottom=bottom+height;
hbtplay = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Play', ...
'Callback','demo_emgmm(''play'',gcf)');
% Reset button: set up t = 0
bottom=bottom+height;
hbtreset = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Reset', ...
'Callback','demo_emgmm(''reset'',gcf)');
% Create data
bottom=bottom+1.5*height;
hbtcreat = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Create data', ...
'Callback','demo_emgmm(''creatdata'',gcf)');
% Load data
bottom=bottom+1*height;
hbtload = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Load data', ...
'Callback','demo_emgmm(''getfile'',gcf)');
% Save model bottom=bottom+1.5*height;
hbtSaveModel = uicontrol(...
'Units','Normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Save model', ...
'Callback','demo_emgmm(''savemodel'',gcf)');
% Load model% bottom=bottom+1*height;
% hbtLoadModel = uicontrol(...
% 'Units','Normalized', ...
% 'ListboxTop',0, ...
% 'Position',[left bottom width height], ...
% 'String','Load model', ...
% 'Callback','demo_emgmm(''loadmodel'',gcf)');
% == PopUp Menu =====================================================
bottom=0.95-height;
htxfeatures=uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',[left bottom width height], ...
'String','Covariance');
% popup menu
bottom=bottom-height;
hpufeatures=uicontrol( ...
'Style','popup', ...
'Units','normalized', ...
'Position',[left bottom width height], ...
'String',['Diagonal '; 'Full ']);
% == Edit line ==========================================================
% prior info about number of the classes
bottom=bottom-1.3*height;
htxclasses=uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',[left bottom width 0.9*height], ...
'String','Components');
bottom=bottom-height;
hedclasses = uicontrol(...
'Units','normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'Style','edit',...
'String','2');
% Iterations
bottom=bottom-1.3*height;
htxiter=uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',[left bottom width 0.9*height], ...
'String','Iterations');
bottom=bottom-height;
hediter = uicontrol(...
'Units','normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'Style','edit',...
'String','1');
% == CheckBox =========================================================
% Should the first algorithm step be random or not ?
bottom=bottom-height*1.3;
hxbrandom = uicontrol(...
'Style','checkbox', ...
'Units','normalized', ...
'ListboxTop',0, ...
'Position',[left bottom width height], ...
'String','Random init');
%=====================================================================
% Store handlers handlers=struct(... 'ellipse',struct('handler',-1,'mi',[],'sigma',[],'t',0,'Pk',[],... 'solution',0),... 'center',[],... 'graph1',struct('handler',-1,'loglik',[],'axist',0,'time',[]),... 'title1',htitle1,... 'title2',htitle2,... 'btSaveModel',hbtSaveModel,...% 'btLoadModel',hbtLoadModel,... 'btstep',hbtstep,... 'btstop',hbtstop,... 'btclose',hbtclose,... 'btplay',hbtplay,... 'btreset',hbtreset,... 'btinfo',hbtinfo,... 'btload',hbtload,... 'btcreat',hbtcreat,... %%% 'console',hconsole,... 'txsteps',htxsteps,... 'txclasses',htxclasses,... 'txiter',htxiter,... 'txfeatures',htxfeatures,... 'pufeatures',hpufeatures,... 'editer',hediter,... 'xbrandom',hxbrandom,... 'axes1',haxes1,... 'axes2',haxes2,... 'edclasses',hedclasses); set(hfigure,'UserData',handlers) % Reset demo_emgmm('reset',hfigure); % Put figure on desktop set(hfigure,'Visible','on'); drawnow; case 'savemodel' % == Save model ============================================ h=get(hfigure,'UserData'); if h.ellipse.t == 0, errordlg('No model has found yet.','No model to save','modal'); return; end [name,path]=uiputfile('*.mat','Save model'); if name ~= 0,
Mean = h.ellipse.mi;
Cov = reshape(h.ellipse.sigma,2,2,size(Mean,2));
Prior = h.ellipse.Pk; fun = 'pdfgmm'; save(strcat(path,name),'Mean','Cov','Prior','fun');
end case 'loadmodel' % == Load model ============================================ h=get(hfigure,'UserData'); sets=get(h.axes1,'UserData'); % Are data sets loaded ? if isempty(sets)==1,
% no warning is needy because of the huge topic on the screen:))). return; end [name,path]=uigetfile('*.mat','Load model'); if name ~= 0, fname=strcat(path,name);% if checkdat(fname,DATA_IDENT,2,0)==1, demo_emgmm('reset',hfigure); model=load(fname); if exist('model.Pk')==0, % suppose uniformly distributed Pk model.Pk=ones(1,sum(model.K))/sum(model.K); end h.ellipse.mi = model.MI; h.ellipse.sigma=model.SIGMA; h.ellipse.Pk = model.Pk; h.ellipse.solution=0; h.ellipse.t=0; set(h.edclasses,'String',num2str(sum(model.K))); h.ellipse.classes=sum(model.K); h.ellipse.features=get(h.pufeatures,'Value'); set(hfigure,'UserData',h); demo_emgmm('step',hfigure); % else% errordlg('This file does not contain required data.','Bad file','modal');% end end case 'play' % == Play ============================================ h=get(hfigure,'UserData'); % get data set sets=get(h.axes1,'UserData'); % Are data sets loaded ? if isempty(sets)==1 | h.ellipse.solution==1,
%% text=sprintf(...%% 'No action performed. No data to work on. Load or create it!');%% set(h.console,'String',text); return; end % disable button set([h.editer,h.btstep,h.btclose,h.btplay,... h.btreset,h.btinfo,h.btload,h.btcreat,h.txiter],... 'Enable','off'); % enable stop button set(h.btstop,'Enable','on'); % get # of iterations iter=str2num(get(h.editer,'String')); % # of classes if h.ellipse.t==0, h.ellipse.classes=str2num(get(h.edclasses,'String')); h.ellipse.features=get(h.pufeatures,'Value'); set([h.xbrandom,h.edclasses,h.txclasses,h.pufeatures,h.txfeatures],... 'Enable','off'); end % Shall the init be random, yes or no ? randinit=get(h.xbrandom,'Value'); % set stop button set(h.btstop,'UserData',0); % Play - adaptation process play=1; % flag 1 - not finished, 1 - finished; while play==1 & get(h.btstop,'UserData')==0,
options.rand = randinit;
switch 3-h.ellipse.features, case 1, options.cov_type = 'full'; case 2, options.cov_type = 'diag'; end% options.cov_type = 3-h.ellipse.features;
options.ncomp=h.ellipse.classes;
options.tmax = iter+h.ellipse.t;
if h.ellipse.t >= 1,
init_model.logL = h.ellipse.logL; init_model.Alpha = h.ellipse.Alpha;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -