📄 demo_svm.m
字号:
%UserData stores data that you want to associate with the device object.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 重新设置
demo_svm('reset',hfigure);
% 将图形窗口显示在桌面上
set(hfigure,'Visible','on');
drawnow;
%drawnow flushes the event queue and updates the figure window.
%== 训练SVM并显示结果 ================================
case 'train'
data = get( hfigure, 'UserData');
%%%%%%%%%%%最重要的一句
trn = get( data.axes, 'UserData' );%获取坐标轴对象的信息
if isempty( trn ),
return;
end
C = str2num(get( data.ed_cconst, 'String' ));
ker_inx = get( data.pu_kernel, 'Value' ); %获取核函数信息
if ker_inx == 1,
ker = 'linear';
elseif ker_inx == 2;
ker = 'poly';
else
ker = 'rbf';
end
arg = str2num(get( data.ed_arg, 'String' )); %获取参数kernel argument
[Alpha,bias] = svm_train( data, trn, ker, arg, C );
% 将坐标轴对象data.axes设置为当前对象
axes( data.axes );
% 删除坐标轴对象data.axes的子对象
clrchild( data.axes);
% 获取options
options.background = get( data.xb_background, 'Value');
% 画出决策函数
model.sv.X = trn.X;
model.sv.y = trn.I;
ppatterns(model.sv); % 将数据点样本画在特征空间中 输出: H [struct] 画图对象的句柄
inx=find( Alpha ~= 0 );
model.sv.X = trn.X(:,inx);
model.sv.y = trn.I(:,inx);
model.Alpha = Alpha(:,inx)';
model.b = bias;
model.options.ker = ker;
model.options.arg = arg;
psvm( model, options );
%== 控制下拉菜单:“训练算法” ==========================
case 'algo_handler'
data=get(hfigure,'UserData');
% 获取是哪一种训练算法?
switch get(data.pu_algo, 'Value' )
case 1 % SMO算法
set(data.tx_cconst,'Enable','on');
set(data.ed_cconst,'Enable','on');
set(data.tx_param,'Enable','on');
set(data.tx_param,'String',SMO_PARAM);
set(data.ed_param,'Enable','on');
set(data.ed_param,'String',DEF_SMO_PARAM);
end
%== 对单列表框C-const的控制 ===========================
case 'cconst_handler'
data=get(hfigure,'UserData');
C = str2num(get(data.ed_cconst,'String'));
if C <= 0,
C = 100;
end
set( data.ed_cconst,'String',num2str(C));
%== 对单列表框Kernel argument的控制 ===========================
case 'arg_handler'
data=get(hfigure,'UserData');
arg = str2num(get(data.ed_arg,'String'));
if arg < 0,
arg = 1;
end
set( data.ed_arg, 'String',num2str( arg));
%== 对下拉菜单:“核函数”的控制 ===========================
case 'kernel_handler'
data=get(hfigure,'UserData');
ker_inx = get( data.pu_kernel,'Value');
if ker_inx >= 2,
set( data.ed_arg,'Enable','on');
set( data.tx_arg,'Enable','on');
else
set( data.ed_arg,'Enable','off');
set( data.tx_arg,'Enable','off');
end
%== 调用创建数据 ==========================================
case 'creatdata'
createdata('finite',2,'demo_svm','created',hfigure);
%% 将单元数组转化为结构体
%检查给定的文件是否包含二维的向量,即二维数据集
%数据生成器,用户通过鼠标手动创建数据%
% == 装载已经创建了的数据 ================================
case 'created'
% 获取图形窗口的句柄,并使它作为当前窗口
figure(hfigure);
data = get(hfigure,'UserData');
% 获取文件名
path=varargin{1};
name=varargin{2};
pathname=strcat(path,name);
if check2ddata(pathname), %检查给定的文件是否包含二维的向量,即二维数据
file.pathname=pathname;
file.path=path;
file.name=name;
set(data.bt_load,'UserData',file);
demo_svm('loadsets',hfigure);
demo_svm('reset',hfigure);
else
errordlg('此文件不包含满足要求的数据.','错误文件','modal');
end
% == 调用标准的打开文件对话框 ==========================
case 'getfile'
data=get(hfigure,'UserData');
[name,path]=uigetfile('*.mat','Open file');
if name~=0,
file.pathname=strcat(path,name);
file.path=path;
file.name=name;
if check2ddata( file.pathname ),
set(data.bt_load,'UserData',file);
demo_svm('loadsets',hfigure);
demo_svm('reset',hfigure);
else
errordlg('此文件不包含满足要求的数据.','错误文件','modal');
end
end
case 'loadsets'
% == 从文件装载数据 ==========================================
data = get( hfigure,'UserData' );
% 删除坐标轴对象data.axes的子对象
clrchild( data.axes);
% 设置x、y轴的标签
xlabel('x轴');
ylabel('y轴');
% 获取装载的数据集的文件名
file=get( data.bt_load,'UserData');
% 装载数据
trn = load(file.pathname );
trn.I=trn.y;
trn.N= 2;
trn.K = [length( find(trn.y==1)),length(find(trn.y==2))];
% 把数据集存到与坐标轴对象axes联系起来的数据“UserData”中
set( data.axes,'UserData', trn);
% 将坐标轴对象data.axes设置为当前对象
axes( data.axes );
% 将数据点画在坐标轴内
ppatterns( trn );
drawnow;
% == “重新设置按钮”==========================================================
case 'reset'
data = get(hfigure,'UserData');
% 删除坐标轴对象data.axes的子对象
clrchild( data.axes);
% 获取数据集
trn = get( data.axes, 'UserData');
% 获取文件
file = get( data.bt_load,'UserData');
% 产生注释
if isempty( trn ) == 0,
consoletext=sprintf('数据已经装载。\n请选择训练算法和核函数,按“训练SVM”按钮对数据进行训练分类。\n');
titletext=sprintf('File: %s, # of points K = %d', file.name , size(trn.X,2));
set( data.axes, 'XLimMode','auto', 'YLimMode','auto');
ppatterns( trn);
else
consoletext=sprintf(['尚未装载数据。\n' ...
'请按“创建数据”按钮创建自己的数据。\n'...
'请按“装载数据”按钮装载数据。\n' ...
'装载实验数据路径为: ../createdata/svm_samples']);
titletext='';
pos=get( data.axes,'Position');
fsize=min(pos(3),pos(4))/10;
setaxis( data.axes,[-1 1 -1 1]);
builtin('text',0,0,'请按 “装载数据” 按钮装载数据.',...
'HorizontalAlignment','center',...
'FontUnits','normalized',...
'Clipping','on',...
'FontSize',fsize);
end
% 显示注释信息
set( data.console,'String',consoletext );
% 通过title创建一个要书写的文本对象
pos=get( data.axes,'Position');
fsize=(1-pos(2)-pos(4))*1;
title(titletext,...
'Parent', data.axes,...
'VerticalAlignment','bottom',...
'HorizontalAlignment','left',...
'FontUnits','normalized',...
'Units','normalized',...
'Position',[0 1 0],...
'FontSize',fsize);
% == 进入Matlab Help ==================================
case 'info'
helpwin(mfilename);
end
return;
%=========定义svm_train函数=====================================
function [Alpha,bias] = svm_train( data, trn, ker, arg, C )
if strcmpi( ker, 'linear'),
strarg = '-';
else
strarg = num2str( arg);
end
param = str2num( get( data.ed_param,'String'));
switch get( data.pu_algo, 'Value' ),
case 1 % 序列最小优化(SMO)算法
options.ker = ker;
options.arg = arg;
options.C = C;
options.eps = param(1);
options.tol = param(2);
model = smo( trn, options);
Alpha = zeros(1,size(trn.X,2));
Alpha(model.sv.inx) = model.Alpha(:)';
bias = model.b;
nsv = model.nsv;
kercnt=model.kercnt;
trn_err = model.trnerr;
margin = model.margin;
text = sprintf(...
['训练算法:序列最小优化(SMO)算法\n',...
'核函数: %s (%s)\n',...
'C: %.4f\n',...
'支持矢量的个数: %d\n',...
'分类间隔: %.4f\n',...
'分类出错率: %.2f%%'],...
ker, strarg, C, nsv, margin, 100*trn_err );
end
% 显示注释
set( data.console,'String', text );
return;
%====定义clrchild函数==================
function []=clrchild(handle)
delete(get(handle,'Children'));
return;
%====定义setaxis函数==================
function []=setaxis(handle,rect)
set(handle,'XLim',rect(1:2));%设置x轴的区间限制
set(handle,'YLim',rect(3:4));
if size(rect,2)>=6,
set(handle,'ZLim',rect(5:6));
end
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -