📄 ganders.html
字号:
<html><head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1"> <title>ganders.m</title><link rel="stylesheet" type="text/css" href="../../../m-syntax.css"></head><body><code><span class=defun_kw>function</span> <span class=defun_out>model </span>= <span class=defun_name>ganders</span>(<span class=defun_in> distrib, options, init_model </span>)<br><span class=h1>% GANDERS Solves the Generalized Anderson's task.</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Synopsis:</span></span><br><span class=help>% model = ganders( distrib)</span><br><span class=help>% model = ganders( distrib, options)</span><br><span class=help>% model = ganders( distrib, options, init_model )</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Description:</span></span><br><span class=help>% This function is an implementation of the general framework </span><br><span class=help>% to find the optimal solution of the Generalized Anderson's </span><br><span class=help>% task [SH10].</span><br><span class=help>%</span><br><span class=help>% The goal of the GAT is find the binary linear classification</span><br><span class=help>% rule (g(x)=sgn(W'*x+b) with minimal probability of </span><br><span class=help>% misclassification. The conditional probabilities are known to </span><br><span class=help>% be Gaussians their paramaters belong to a given set of parameters. </span><br><span class=help>% The true parameters are not known. The linear rule which </span><br><span class=help>% guarantes the minimimal classification error for the worst </span><br><span class=help>% possible case (the worst configuration of Gaussains) is </span><br><span class=help>% sought for.</span><br><span class=help>% </span><br><span class=help>% <span class=help_field>Input:</span></span><br><span class=help>% distrib [struct] Set of binary labeled Gaussians.</span><br><span class=help>% .Mean [dim x ncomp] Mean vectors.</span><br><span class=help>% .Cov [dim x dim x ncomp] Covariance matrices.</span><br><span class=help>% .y [1 x ncomp] Labels of the Gaussians (1 or 2).</span><br><span class=help>% </span><br><span class=help>% options [struct] Determines stopping conditions:</span><br><span class=help>% .tmax [1x1] Maximal number of iterations (default inf).</span><br><span class=help>% .eps [1x1] Minimal improvement of the optimized </span><br><span class=help>% criterion (default 1e-6).</span><br><span class=help>% .mineps_tmax [1x1] Number of iterations of the one-dimensional </span><br><span class=help>% numerical search (default 100).</span><br><span class=help>%</span><br><span class=help>% init_model [struct] Initial model:</span><br><span class=help>% .W, .b, .t see below.</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Output:</span></span><br><span class=help>% model [struct] Binary linear classifer:</span><br><span class=help>% .W [dim x 1] Normal vector of the found hyperplane W'*x + b = 0.</span><br><span class=help>% .b [1x1] Bias of the hyperplane.</span><br><span class=help>% </span><br><span class=help>% .r [1x1] Mahalanobis distance for the cloasest Gaussian.</span><br><span class=help>% .err [1x1] Probability of misclassification.</span><br><span class=help>% .t [1x1] Number of iterations.</span><br><span class=help>% .exitflag [1x1] 0 ... maximal number of iterations was exceeded.</span><br><span class=help>% 1 ... solution was found.</span><br><span class=help>% -1 ... solution (with err < 0.5) does not exist.</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Example:</span></span><br><span class=help>% distrib = load('mars');</span><br><span class=help>% model = ganders( distrib );</span><br><span class=help>% figure; pandr( model, distrib );</span><br><span class=help>%</span><br><span class=help>% See also </span><br><span class=help>% ANDRORIG, EANDERS, GGRADANDR, ANDRERR, LINCLASS.</span><br><span class=help>%</span><br><hr><span class=help1>% <span class=help1_field>About:</span> Statistical Pattern Recognition Toolbox</span><br><span class=help1>% (C) 1999-2003, Written by Vojtech Franc and Vaclav Hlavac</span><br><span class=help1>% <a href="http://www.cvut.cz">Czech Technical University Prague</a></span><br><span class=help1>% <a href="http://www.feld.cvut.cz">Faculty of Electrical Engineering</a></span><br><span class=help1>% <a href="http://cmp.felk.cvut.cz">Center for Machine Perception</a></span><br><br><span class=help1>% <span class=help1_field>Modifications:</span></span><br><span class=help1>% 4-may-2004, VF</span><br><span class=help1>% 17-sep-2003, VF</span><br><br><hr><span class=keyword>if</span> <span class=stack>nargin</span> < 2, options = []; <span class=keyword>else</span> options=c2s(options); <span class=keyword>end</span><br><span class=keyword>if</span> ~isfield(options,<span class=quotes>'eps'</span>), options.eps=1e-6; <span class=keyword>end</span><br><span class=keyword>if</span> ~isfield(options,<span class=quotes>'tmax'</span>), options.tmax=inf; <span class=keyword>end</span><br><span class=keyword>if</span> ~isfield(options,<span class=quotes>'mineps_tmax'</span>), options.mineps_tmax = 100; <span class=keyword>end</span><br><br><span class=comment>% get dimension and number of distributions</span><br>[dim,ncomp] = size(distrib.Mean);<br><br><span class=comment>% inicialization</span><br>exitflag = 0;<br>t = 0;<br><br><span class=comment>% add one constant coordinate</span><br>Mu = [distrib.Mean;ones(1,ncomp)];<br>Mu(:,find( distrib.y==2) ) = -Mu(:,find( distrib.y==2) );<br>C = zeros(dim+1,dim+1,ncomp);<br>C(1:dim,1:dim,:) = distrib.Cov;<br><br><span class=keyword>if</span> <span class=stack>nargin</span> == 3,<br> W = [init_model.W; init_model.b];<br> <span class=keyword>if</span> isfield( init_model, <span class=quotes>'t'</span> ), t = init_model.t; <span class=keyword>end</span><br><span class=keyword>end</span><br><br><span class=keyword>if</span> t==0,<br> [W,eflag] = optimal_hyperplane(Mu);<br><br> <span class=keyword>if</span> eflag <= 0, exitflag = -1; <span class=keyword>end</span><br><span class=keyword>end</span><br> <br><span class=comment>% find the minimal radius of all the ellipsoids</span><br>[minr,inx] = min_radius(W,Mu,C);<br>old_minr=minr;<br><br><span class=comment>% main cycle</span><br><span class=keyword>while</span> exitflag==0 & t < options.tmax,<br> t = t + 1;<br> <br> <span class=comment>% compute contact points </span><br> X0=zeros(dim+1,ncomp);<br> <span class=keyword>for</span> i=1:ncomp,<br> X0(:,i)=Mu(:,i)-(minr/sqrt(W'*C(:,:,i)*W))*C(:,:,i)*W;<br> <span class=keyword>end</span><br><br> <span class=comment>% find inprovig direction </span><br> [dW,eflag]=optimal_hyperplane( X0 );<br> <br> <span class=keyword>if</span> eflag > 0,<br><br> <span class=comment>% find how much to move along the dw direction and move</span><br> k = gat1dsearch(Mu,C,W,dW,options.mineps_tmax,0);<br><br> <span class=comment>% update</span><br> W=W*(1-k)+dW*k;<br><br> [minr,inx] = min_radius(W,Mu,C);<br><br> <span class=keyword>if</span> minr-old_minr < options.eps,<br> exitflag = 1;<br> <span class=keyword>end</span><br> <br> <span class=keyword>else</span><br> exitflag = 1;<br> <span class=keyword>end</span><br><br> old_minr = minr;<br><span class=keyword>end</span><br><br><span class=comment>% setup model</span><br>model.W = W(1:<span class=keyword>end</span>-1);<br>model.b = W(<span class=keyword>end</span>);<br>model.r = minr;<br>model.err = 1-cdf(<span class=quotes>'norm'</span>,minr,0,1);<br>model.t = t;<br>model.exitflag = exitflag;<br>model.options = options;<br>model.fun = <span class=quotes>'linclass'</span>;<br><br><span class=jump>return</span>;<br><br><br><span class=comment>%----------------------------------------------------------</span><br><span class=defun_kw>function</span> <span class=defun_out>[W,exitflag] </span>= <span class=defun_name>optimal_hyperplane</span>(<span class=defun_in>X</span>)<br><span class=comment>% finds the optimal hyperplane passing through the origin</span><br><br>[dim,num_data]=size(X);<br><br>H=eye(dim);<br>f=zeros(dim,1);<br>b=-ones(num_data,1);<br>A=-X';<br><br><span class=comment>% quadratic programming</span><br>options=optimset(<span class=quotes>'Display'</span>,<span class=quotes>'off'</span>,<span class=quotes>'Diagnostics'</span>,<span class=quotes>'off'</span>,<span class=quotes>'LargeScale'</span>,<span class=quotes>'off'</span>);<br>[W,fval,exitflag]=quadprog(H,f,A,b,[],[],[],[],[],options);<br><br><span class=jump>return</span>;<br><br><span class=comment>%----------------------------------------------------------</span><br><span class=defun_kw>function</span> <span class=defun_out>[minr,inx] </span>= <span class=defun_name>min_radius</span>(<span class=defun_in>W,Mu,C</span>);<br><span class=comment>% find radius of the miniaml ellipsoids</span><br><br>Radius = zeros(size(Mu,2),1);<br><span class=keyword>for</span> i = 1:size(Mu,2),<br> den = sqrt(W'*C(:,:,i)*W);<br> <span class=keyword>if</span> den ~= 0,<br> Radius(i) = W<span class=quotes>'*Mu(:,i)/sqrt(W'</span>*C(:,:,i)*W);<br> <span class=keyword>else</span><br> Radius(i) = 0;<br> <span class=keyword>end</span><br><span class=keyword>end</span><br>[minr,inx]=min( Radius );<br><br><span class=jump>return</span>;<br></code>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -