📄 demo_mmgauss.m
字号:
function demo_mmgauss(action,hfigure,varargin)% DEMO_MMGAUSS Demo on minimax estimation for Gaussian.%% Synopsis:% demo_mmgauss% % Description:% demo_mmgauss demonstrates the minimax estimation algorithm % [SH10] for bivariate Gaussian distribution. The training data % is supposed to contain samples which well describing the % probability distribution function (pdf), i.e., which have % high value of pdf. The samples do not have to be i.i.d. in % contrast to the ML estimation.% % The estimated model is visualized as an ellipsoid:% shape is influenced by the covariance matrix and the center% corresponds to the mean vector.% The lower (red) and upper (blue) bound on the optimal value % of the optimized minimax criterion is displayed at the bottom% part of the window.%% Control:% Epsilon - Stopping condition. The algorithm stops if the % difference between lower and the upper bound% is less then the epsilon.% % Iterations - Number of iterations after which the model % is re-displayed.%% FIG2EPS - Exports figure to the PostScript file.% Load data - Loads input data sample from file.% Create data - Invokes program for creating data sample.% Reset - Resets the demo.% Play - Runs the algorithm.% Stop - Stops the running algorithm.% Step - Performs one iteration of the algorithm.% Info - Invokes the info box.% Close - Closes the program.%% See also MMGAUSS.%% 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:% 2-may-2004, VF% 19-sep-2003, VF% 3-mar-2003, VF% 11-june-2001, V.Franc, comments added.% 24. 6.00 V. Hlavac, comments polished.% Used functions: PPOINTS, ELLIPSBORDER=0.25; % space between window limits and the pointsCENTERSIZE=10; % size of center pointLINE_WIDTH=1;AXIST_ADD=10;DATA_IDENT='Finite sets, Enumeration'; % file identifierif 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','Minimax learning', ... 'Visible','off',... 'NumberTitle','off', ... 'Units','normalized', ... 'Position',[left bottom width height],... 'tag','Demo_mmgauss',... 'doublebuffer','on',... 'backingstore','off'); % == Axes =============================================================== % axes with prob. left=0.1; width=0.65; bottom=0.1; height=0.28; haprob=axes(... 'Units','normalized', ... 'NextPlot','add',... 'Position',[left bottom width height]); title('blue - log p(x), red - \Sigma \alpha(x) log p(x)',... 'Parent',haprob,... 'VerticalAlignment','bottom',... 'Units','normalized',... 'HorizontalAlignment','left',... 'Position',[0 1 0]); htxsteps=xlabel('step number'); % points height=0.45; bottom=0.5;% 'XTick',[],'YTick',[], ... haset=axes(... 'Units','normalized', ... 'NextPlot','add',... 'Position',[left bottom width height]); ylabel('feature y'); xlabel('feature x'); % == 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.05; 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_mmgauss(''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_mmgauss(''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: start up adaptation bottom=bottom+height; hbtplay = uicontrol(... 'Units','Normalized', ... 'ListboxTop',0, ... 'Position',[left bottom width height], ... 'String','Play', ... 'Callback','demo_mmgauss(''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_mmgauss(''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_mmgauss(''creatdata'',gcf)'); % Load data bottom=bottom+1*height; hbtload = uicontrol(... 'Units','Normalized', ... 'ListboxTop',0, ... 'Position',[left bottom width height], ... 'String','Load data', ... 'Callback','demo_mmgauss(''getfile'',gcf)'); % == Edit line ========================================================== % epsilon bottom=0.95-height; htxeps=uicontrol( ... 'Style','text', ... 'Units','normalized', ... 'Position',[left bottom width 0.9*height], ... 'String','epsilon'); bottom=bottom-height; hedeps = uicontrol(... 'Units','normalized', ... 'ListboxTop',0, ... 'Position',[left bottom width height], ... 'Style','edit',... 'String','0.1'); % Iterations bottom=bottom-1.5*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'); % == Texts =========================================================== htitle1=title('No data loaded',... 'Parent',haset,... 'VerticalAlignment','bottom',... 'HorizontalAlignment','left',... 'Units','normalized',... 'Position',[0 1 0]); %===================================================================== % Store handlers handlers=struct(... 'ellipse',struct('handler',-1,'center',-1,'mi',[],'sigma',[],'t',0,'N',[]),... 'plot1',struct('handler',-1,'topps',[],'axist',0,'time',[]),... 'plot2',struct('handler',-1,'minps',[]),... 'title1',htitle1,... 'btstep',hbtstep,... 'btstop',hbtstop,... 'btclose',hbtclose,... 'btplay',hbtplay,... 'btreset',hbtreset,... 'btinfo',hbtinfo,... 'btload',hbtload,... 'btcreat',hbtcreat,... 'txsteps',htxsteps,... 'txeps',htxeps,... 'txiter',htxiter,... 'aset',haset,... 'aprob',haprob,... 'editer',hediter,... 'edeps',hedeps); set(hfigure,'UserData',handlers) % Reset demo_mmgauss('reset',hfigure); % Put figure on desktop set(hfigure,'Visible','on'); drawnow;case 'play' % == One step learning ============================================== h=get(hfigure,'UserData'); % get data set sets=get(h.aset,'UserData'); % are data sets loaded ? if isempty(sets)==1, return; end % disable button set([h.editer,h.edeps,h.btstep,h.btclose,h.btplay,... h.btreset,h.btinfo,h.btload,h.btcreat,h.txeps,h.txiter],... 'Enable','off'); % enable stop button set(h.btstop,'Enable','on'); % get # of iter and epsilon iter=str2num(get(h.editer,'String')); epsilon=str2num(get(h.edeps,'String')); % set stop button set(h.btstop,'UserData',0); % start point for plot if h.ellipse.t==0 & iter > 1,%% [mi,sigma,solution,minp,topp]=mmln(sets.X,epsilon,1,0); options.eps = epsilon; options.tmax = 1; model=mmgauss(sets.X,options); mi = model.Mean; sigma = model.Cov; minp = model.lower_bound(end); topp = model.upper_bound(end); solution = model.exitflag; h.plot1.time=[1]; h.plot2.minps=[minp]; h.plot1.topps=[topp]; end % Play - adaptation process play=1; while play==1 & get(h.btstop,'UserData')==0, % perform one learning step% [mi,sigma,solution,minp,topp,h.ellipse.N,h.ellipse.t]=...% mmln(sets.X,epsilon,iter,h.ellipse.t,h.ellipse.N); options.tmax = iter+h.ellipse.t; options.eps = epsilon; if h.ellipse.t == 0, model=mmgauss(sets.X,options); else init_model.t = h.ellipse.t; init_model.Alpha = h.ellipse.N; model=mmgauss(sets.X,options,init_model); end mi= model.Mean; sigma = model.Cov; solution = model.exitflag; minp = model.lower_bound(end); topp = model.upper_bound(end); h.ellipse.N = model.Alpha; h.ellipse.t = model.t; text=sprintf('iteration t=%d ',h.ellipse.t); if solution==1, text=strcat(text,', algorithm has converged.'); play=0; else % add new value to plot h.plot1.time=[h.plot1.time,h.ellipse.t]; h.plot2.minps=[h.plot2.minps,minp]; h.plot1.topps=[h.plot1.topps,topp]; % is axis to be changed ? if h.ellipse.t > h.plot1.axist, h.plot1.axist=h.ellipse.t+iter*AXIST_ADD; set(h.aprob,'XLim',[1 h.plot1.axist]); end set(h.plot2.handler,'XData',h.plot1.time,'YData',h.plot2.minps,'Visible','on'); set(h.plot1.handler,'XData',h.plot1.time,'YData',h.plot1.topps,'Visible','on'); % erase old ellipse, compute and plot new one set(h.ellipse.center,'XData',mi(1),'YData',mi(2),'Visible','on'); r=sqrt(max(mahalan(sets.X,mi,sigma)));%%% [x,y]=ellipse(inv(sigma),50,r,mi); [x,y]=ellips(mi,inv(sigma),r,40);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -