📄 smo.m
字号:
function model = smo( data, options, init_model)
% 说明:
% 这个函数实现了序列最小优化(SMO)算法的二元支持矢量机分类器
%
% 输入:
% data [struct] 二元带标签的训练向量
% .X [dim x num_data] 训练数据向量
% .y [a x num_data] 数据集所属的类别(1,2)
%
% options [struct] 控制参数:
% .ker [string] 核函数定义(默认为 'linear');
% .arg [1 x nargs] 核变量 (默认为 1).
% .常量 C :
% C [1x1] .. 对所有的数据.
% C [1x2] .. 对每个单独的数据类 C=[C1,C2].
% C [1xnum_data] .. 对每个单独的训练向量
% .eps [1x1] SMO 参数 (默认为 0.001).
% .tol [1x1] T容忍的 KKT条件 (默认为 0.001).
%
% init_model [struct] 指定最初的模型:
% .Alpha [num_data x 1] 初始模型
% .b [1x1] 偏差
% 如果没有给定则设置默认为0
%
% 输出:
% model [struct] 二元SVM 分类器:
% .Alpha [nsv x 1] Lagrangians 的权值
% .b [1x1] 偏倚
% .sv.X [dim x nsv] 支持矢量
% .nsv [1x1] 支持矢量的个数
% .kercnt [1x1] SMO的核值.
% .trnerr [1x1] 训练分类误差
% .margin [1x1] 分类间隔
% .cputime [1x1] 计算CPU 时间
% .options [struct] options的值
% 时钟
tic;
% 输入变量设置
%-------------------------------------------------------
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
% 最优化
%----------------------------------------------------
[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 );
% 设置输出
%------------------------------------------------------
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));
% 计算使用线性核函数时的超平面正交向量
if strcmpi(options.ker,'linear'),
model.W = model.sv.X*model.Alpha;
end
model.options = options;
model.fun = 'svmclass';
model.cputime = toc;
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -