www.gusucode.com > 支持向量机的Matlab实现,支持多分类,据有GUI操作界面 > code11/MATLAB_svm_gui/function/smo.m
function model = smo( data, options, init_model) % SMO Sequential Minimal Optimization for binary SVM with L1-soft margin. % % Synopsis: % model = smo( data ) % model = smo( data, options ) % model = smo( data, options, init_model) % % Description: % This function is implementation of the Sequential Minimal % Optimizer (SMO) [Platt98] to train the binary Support Vector % Machines Classifier with L1-soft margin. % % Input: % data [struct] Binary labeled training vectors: % .X [dim x num_data] Training vectors. % .y [a x num_data] Labels (1 or 2). % % options [struct] Control parameters: % .ker [string] Kernel identifier (default 'linear'); % See 'help kernel'for more info. % .arg [1 x nargs] Kernel argument(s) (default 1). % .C Regularization constant (default C=inf). The constant C can % be given as: % C [1x1] .. for all data. % C [1x2] .. for each class separately C=[C1,C2]. % C [1xnum_data] .. for each training vector separately. % .eps [1x1] SMO paramater (default 0.001). % .tol [1x1] Tolerance of KKT-conditions (default 0.001). % % init_model [struct] Specifies initial model: % .Alpha [num_data x 1] Initial model. % .b [1x1] Bias. % If not given then it is set to zero by default. % % Output: % model [struct] Binary SVM classifier: % .Alpha [nsv x 1] Weights (Lagrangians). % .b [1x1] Bias. % .sv.X [dim x nsv] Support vectors. % .nsv [1x1] Number of Support Vectors. % .kercnt [1x1] Number of kernel evaluations used by SMO. % .trnerr [1x1] Training classification error. % .margin [1x1] Margin of the found classifier. % .cputime [1x1] Used CPU time in seconds. % .options [struct] Copy of used options. % % Example: % trn = load('riply_trn'); % model = smo(trn,struct('ker','rbf','C',10,'arg',1)); % figure; ppatterns(trn); psvm(model); % tst = load('riply_tst'); % ypred = svmclass( tst.X, model ); % cerror( ypred, tst.y ) % % See also % SVMCLASS, SVMLIGHT, SVMQUADPROG. % % 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: % 23-may-2004, VF % 17-September-2001, V. Franc, created % timer tic; % Input arguments %------------------------------------------------------- if nargin < 2, options = []; else options=c2s(options); end if ~isfield(options,'ker'), options.ker = 'linear'; end if ~isfield(options,'arg'), options.arg = 1; end if ~isfield(options,'C'), options.C = inf; end if ~isfield(options,'eps'), options.eps = 0.001; end if ~isfield(options,'tol'), options.tol = 0.001; end [dim,num_data] = size(data.X); if nargin < 3, init_model.Alpha = zeros(num_data,1); init_model.b = 0; end % run optimizer %---------------------------------------------------- [model.Alpha, model.b, model.nsv, model.kercnt, model.trnerr, model.margin]... = smo_mex(data.X, data.y, options.ker, options.arg, options.C, ... options.eps, options.tol, init_model.Alpha, init_model.b ); % set up output %------------------------------------------------------ inx = find( model.Alpha ); model.sv.X = data.X(:,inx); model.sv.y = data.y(inx); model.sv.inx = inx; model.Alpha = model.Alpha(inx); model.Alpha(find(model.sv.y == 2)) = -model.Alpha(find(model.sv.y == 2)); % computes normal vector of the hypeprlane if linear kernel used if strcmpi(options.ker,'linear'), model.W = model.sv.X*model.Alpha; end model.options = options; model.fun = 'svmclass'; model.cputime = toc; return;