www.gusucode.com > 支持向量机的Matlab实现,支持多分类,据有GUI操作界面 > code11/MATLAB_svm_gui/function/oaosvm.m
function model = oaosvm(data,options) % OAOSVM Multi-class SVM using One-Against-One decomposition. % % Synopsis: % model = oaosvm( data ) % model = oaosvm( data, options ) % % Description: % model = oaosvm( data ) uses one-agains-one deconposition % to train the multi-class Support Vector Machines (SVM) % classifier. The classification into nclass classes % is decomposed into nrule = (nclass-1)*nclass/2 binary % problems. % % model = oaosvm( data, options) allows to specify the % binary SVM solver and its paramaters. % % Input: % data [struct] Training data: % .X [dim x num_data] Training vectors. % .y [1 x num_data] Labels of training data (1,2,...,nclass). % % options [struct] Control parameters: % .solver [string] Function which implements the binary SVM % solver; (default 'smo'). % .verb [1x1] If 1 then a progress info is displayed (default 0). % The other fileds of options specifies the options of the binary % solver (e.g., ker, arg, C). See help of the selected solver. % % Output: % model [struct] Multi-class SVM majority voting classifier: % .Alpha [nsv x nrule] Weights (Lagrangeans). % .bin_y [2 x nrule] Translation between binary responses of % the discriminant functions and class labels. % .b [nrule x 1] Biases of discriminant functions. % .sv.X [dim x nsv] Support vectors. % .nsv [1x1] Number of support vectors. % .trnerr [1x1] Training error. % .kercnt [1x1] Number of kernel evaluations. % .options [struct[ Copy of input argument options. % % Example: % data = load('pentagon'); % options = struct('ker','rbf','arg',1,'C',1000,'verb',1); % model = oaosvm( data, options ); % figure; % ppatterns(data); ppatterns(model.sv.X,'ok',13); % pboundary( model ); % % See also % MVSVMCLASS, OAASVM. % % 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: % 26-may-2004, VF % 4-feb-2004, VF % 9-Feb-2003, VF % Process inputs %----------------------------- if nargin < 2, options = []; else options=c2s(options); end if ~isfield(options,'verb'), options.verb = 0; end if ~isfield(options,'solver'), options.solver = 'smo'; 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 [dim,num_data] = size(data.X); nclass = max(data.y); nrule = (nclass-1)*nclass/2; % display info %--------------------- if (options.verb == 1) fprintf('Binary rules: %d\n', nrule); fprintf('Training data: %d\n', num_data); fprintf('Dimension: %d \n', dim); if isfield( options, 'ker'), fprintf('Kernel: %s\n', options.ker); end if isfield( options, 'arg'), fprintf('arg: %f\n', options.arg(1)); end if isfield( options, 'C'), fprintf('C: %f\n', options.C); end end %---------------------------------------- Alpha = zeros(num_data,nrule); b = zeros(nrule,1); bin_y = zeros(2,nrule); kercnt = 0; % One-Against-One decomposition %----------------------------------- rule = 0; for class1 = 1:nclass-1, for class2 = class1+1:nclass, rule = rule + 1; if options.verb == 1, fprintf('building rule %d-%d (%d of %d)', ... class1, class2, rule, nrule ); end % set binary subtask %--------------------------------------------- bin_y(1,rule) = class1; bin_y(2,rule) = class2; data_inx = find(data.y==class1 | data.y==class2); bin_data.X = data.X(:, data_inx); bin_data.y = data.y(data_inx); bin_data.y(find(bin_data.y == class1)) = 1; bin_data.y(find(bin_data.y == class2)) = 2; % solve binary subtask %--------------------------------------------- bin_model = feval( options.solver, bin_data, options ); Alpha(data_inx(bin_model.sv.inx),rule) = bin_model.Alpha(:); b(rule) = bin_model.b; kercnt = kercnt + bin_model.kercnt; % progress info %----------------------------- if options.verb ==1, if isfield(bin_model, 'trnerr'), fprintf(': trnerr = %.4f', bin_model.trnerr); end if isfield(bin_model, 'margin'), fprintf(', margin = %f', bin_model.margin ); end fprintf('\n'); end end end % set output model %--------------------------------- % indices of all support vectors inx = find(sum(abs(Alpha),2)~= 0); model.Alpha = Alpha(inx,:); model.b = b; model.bin_y = bin_y; model.sv.X = data.X(:,inx); model.sv.y = data.y(inx); model.sv.inx = inx; model.nsv = length(inx); model.kercnt = kercnt; model.options = options; model.fun = 'mvsvmclass'; model.trnerr = cerror( mvsvmclass(data.X, model), data.y ); % display info %-------------------- if options.verb == 1, fprintf('Total training error = %.4f\n', model.trnerr); end return; % EOF