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

📄 demo_emgmm.m

📁 用matlab实现的统计模式识别工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
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 + -