⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smo.m

📁 SVM matlab GUI可视化界面 直观形象 代码解释比较详细 对GUI学习和svm学习都有帮助
💻 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 + -