📄 ekozinec.html
字号:
<html><head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1"> <title>ekozinec.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>ekozinec</span>(<span class=defun_in>data,options,init_model</span>)<br><span class=h1>% EKOZINEC Kozinec's algorithm for eps-optimal separating hyperplane.</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Synopsis:</span></span><br><span class=help>% model = ekozinec(data)</span><br><span class=help>% model = ekozinec(data,options)</span><br><span class=help>% model = ekozinec(data,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 implementation of the Kozinec's algorithm</span><br><span class=help>% with eps-optimality stopping condition [SH10]. The algorithm </span><br><span class=help>% finds the eps-optimal separating hyperplane.</span><br><span class=help>% </span><br><span class=help>% model=ekozinec(data) the Kozinec's rule is used to find the closest </span><br><span class=help>% points w1, w2 from the convex hulls of the vectors from the first and </span><br><span class=help>% the second class. The found points determine the optimal separating </span><br><span class=help>% hyperplane. </span><br><span class=help>% </span><br><span class=help>% model=ekozinec(data,options) specifies stopping conditions of</span><br><span class=help>% the algorithm in structure options:</span><br><span class=help>% .eps [1x1] ... controls how close is the found solution to</span><br><span class=help>% the optimal hyperplane in terms of margin </span><br><span class=help>% (default eps=0.01). The options for eps are: </span><br><span class=help>% eps > 0 ... eps-optimal hyperplane is sought for.</span><br><span class=help>% eps == 0 ... algorithm converges to the optimal hyperplane (but it</span><br><span class=help>% does not have to stop in finite number of iterations).</span><br><span class=help>% eps < 0 ... algorithm stops when the separating hyperplane </span><br><span class=help>% is found (zero training error) regardless the margin </span><br><span class=help>% so it solves the same task as the ordinary Perceptron.</span><br><span class=help>% .tmax [1x1]... maximal number of iterations.</span><br><span class=help>%</span><br><span class=help>% model = ekozinec(data,options,init_model) specifies initial model</span><br><span class=help>% which must contain:</span><br><span class=help>% .W1 [dim x 1] ... Vector from the first convex hull.</span><br><span class=help>% .W2 [dim x 1] ... Vector from the second convex hull.</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Input:</span></span><br><span class=help>% data [struct] Labeled (binary) training data. </span><br><span class=help>% .X [dim x num_data] Input vectors.</span><br><span class=help>% .y [1 x num_data] Labels (1 or 2).</span><br><span class=help>%</span><br><span class=help>% options [struct] </span><br><span class=help>% .eps [real] Controls how closeness to the optimal hypeprlane (see above).</span><br><span class=help>% .tmax [1x1] Maximal number of iterations (default tmax=inf).</span><br><span class=help>% </span><br><span class=help>% init_model [struct] Initial model; must contain items</span><br><span class=help>% .W1 [dim x 1], .W2 [dim x 1] see above.</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 classifier:</span><br><span class=help>% .W [dim x 1] Normal vector of hyperplane.</span><br><span class=help>% .b [1x1] Bias of hyperplane.</span><br><span class=help>% </span><br><span class=help>% .W1 [dim x 1] The nearest vector of the first convex hull.</span><br><span class=help>% .W2 [dim x 1] The nearest vector of the second convex hull.</span><br><span class=help>% .margin [1x1] Margin of the found hyperplane.</span><br><span class=help>% .exitflag [1x1] 1 ... eps-optimality condition satisfied or separating</span><br><span class=help>% hyperplane has been found </span><br><span class=help>% 0 ... number of iterations exceeded tmax.</span><br><span class=help>% .t [1x1] Number of iterations.</span><br><span class=help>%</span><br><span class=help>% <span class=help_field>Example:</span></span><br><span class=help>% data = genlsdata( 2, 50, 1);</span><br><span class=help>% model = ekozinec(data, struct('eps',0.01));</span><br><span class=help>% figure; ppatterns(data); pline(model); </span><br><span class=help>%</span><br><span class=help>% See also </span><br><span class=help>% PERCEPTRON, MPERCEPTRON, 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>% 19-may-2004, VF</span><br><span class=help1>% 3-may-2004, VF</span><br><span class=help1>% 17-Sep-2003, VF</span><br><span class=help1>% 17-Feb-2003, VF</span><br><span class=help1>% 16-Feb-2003, VF</span><br><span class=help1>% 21-apr-2001, V.Franc, created</span><br><br><hr><span class=comment>% get data dimensions</span><br>[dim,num_data] = size(data.X);<br>inx1=find(data.y==1);<br>inx2=find(data.y==2);<br><br><span class=comment>% Process input arguments</span><br><span class=comment>% --------------------------</span><br><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>'tmax'</span>), options.tmax = inf; <span class=keyword>end</span><br><span class=keyword>if</span> ~isfield(options,<span class=quotes>'eps'</span>), options.eps = 0.01; <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><span class=keyword>if</span> <span class=stack>nargin</span> < 3,<br> <span class=comment>% creates init model</span><br> <span class=comment>% --------------------------</span><br> inx1=find(data.y==1); inx2=find(data.y==2);<br> model.W1 = data.X(:,inx1(1));<br> model.W2 = data.X(:,inx2(1));<br><span class=keyword>else</span><br> <span class=comment>% take init model from input</span><br> <span class=comment>%--------------------------------</span><br> model = init_model;<br><span class=keyword>end</span><br><br>model.t = 0; <br>model.exitflag = 0;<br><br><span class=comment>% main loop</span><br><span class=comment>%-----------------------------</span><br><span class=keyword>while</span> model.exitflag == 0 & options.tmax > model.t,<br> <br> model.t = model.t + 1;<br><br> dW = (model.W1 - model.W2);<br> norm_dW = norm( dW );<br> <br> projx = data.X'*dW;<br> <br> projx(inx1) = (projx(inx1) - model.W2'*dW)/norm_dW;<br> projx(inx2) = (-projx(inx2) + model.W1'*dW)/norm_dW;<br> <br> [min_proj, min_inx] = min(projx);<br><br> <span class=comment>% bound for separating or eps-optimal separating hyperplane </span><br> <span class=keyword>if</span> options.eps < 0, bound = norm_dW/2; <span class=keyword>else</span> bound=norm_dW-options.eps/2; <span class=keyword>end</span><br> <br> <span class=keyword>if</span> min_proj <= bound,<br> xt=data.X(:,min_inx);<br><br> <span class=comment>% Updata - Kozinec's rule</span><br> <span class=keyword>if</span> data.y(min_inx) == 1,<br> W1x = model.W1-xt;<br> k = min(1, dW<span class=quotes>'*W1x/ (W1x'</span>*W1x)); <br> model.W1 = model.W1 * (1 - k) + xt * k;<br> <span class=keyword>else</span><br> W2x = model.W2-xt;<br> k = min(1, -dW<span class=quotes>'*W2x / (W2x'</span>*W2x));<br> model.W2 = model.W2 * (1 - k) + xt * k;<br> <span class=keyword>end</span><br><br> model.exitflag = 0;<br> <span class=keyword>else</span><br> model.exitflag = 1;<br> <span class=keyword>end</span><br><br> <span class=comment>% print info</span><br> <span class=keyword>if</span> options.verb == 1 & mod(model.t,100) == 0,<br> <span class=io>fprintf</span>(<span class=quotes>'iter %d: upper_bound = %f, lower_bound = %f, dif = %f\n'</span>, ...<br> model.t, norm_dW/2, min_proj/2, (norm_dW-min_proj)/2 ); <br> <span class=keyword>end</span><br> <br><span class=keyword>end</span><br><br>model.b = 0.5 * (model.W2<span class=quotes>'*model.W2 - model.W1'</span>*model.W1);<br>model.W = model.W1 - model.W2;<br>model.margin = min_proj/2;<br>model.fun = <span class=quotes>'linclass'</span>;<br><br><span class=jump>return</span>;<br><br></code>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -