📄 demosvm.m
字号:
function varargout = demosvm(varargin)
% 非线性模式分析模型.
%
% 说明:
% demosvm实现多类数据分类
% 用户可以装载数据,也可以手动创建
%
% 使用的训练算法:
% - OAA算法
% - OAO 算法
% - BSVM2算法
% 使用的核函数
% -linear(线性核函数)
% - rbf(径向基核函数)
% - poly(多项式核函数)
% - sigmoid(S型核函数)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @demosvm_OpeningFcn, ...
'gui_OutputFcn', @demosvm_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% 系统初始化代码。
% 系统可视化。
function demosvm_OpeningFcn(hObject, eventdata, handles, varargin)
%demosvm中使用以下结构体,来实现图形窗口上的各个控件的数据传送,进而实现各个控件的功能。
data=struct(...
'pushbutton1', handles.pushbutton1,... %创建数据
'pushbutton2', handles.pushbutton2,... %装载数据
'pushbutton3', handles.pushbutton3,... %重置数据
'pushbutton4', handles.pushbutton4,... %训练SVM
'pushbutton5', handles.pushbutton5,... %关闭
'pushbutton6', handles.pushbutton6,... %图象导出
'pushbutton7', handles.pushbutton7,... %计算SV
'pushbutton8', handles.pushbutton8,... %决策边界
'popupmenu1', handles.popupmenu1,...%训练算法
'popupmenu2', handles.popupmenu2,...%核函数
'popupmenu3', handles.popupmenu2,...%C参数
'edit1', handles.edit1,...% 注释窗口
'axes1', handles.axes1); %图形显示坐标轴
set(gcf ,'UserData',data );% 将图形窗口显示在桌面上
set(gcf,'Visible','on');
drawnow;
handles.output = hObject;
guidata(hObject, handles);
function varargout = demosvm_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% 创建数据回调函数
function pushbutton1_Callback(hObject, eventdata, handles)
n=5;
createdata('finite',n,'created',gcf);
% 装载数据回调函数
function pushbutton2_Callback(hObject, eventdata, handles)
h = waitbar(0,'请等待...');%等待条行窗口
for i=1:100,
waitbar(i/100)
end
close(h)
data=get(gcf,'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.pushbutton2,'UserData',file);
cla;
data=loadsets(gcf); % 装载结构型数据
set(gcf,'UserData',data);
set(handles.edit1,'String','数据已经装载 !');
else
errordlg('This file does not contain required data.','Bad file','modal');
end
end
%重置数据回调函数
function pushbutton3_Callback(hObject, eventdata, handles)
cla;
set(handles.edit1,'String','数据已经清除,请重新装载 !');
% 训练SVM回调函数----软件核心部分
function pushbutton4_Callback(hObject, eventdata, handles)
ker_inx = get( handles.popupmenu2, 'Value' ); %获取核函数信息
if ker_inx == 1;
ker = 'linear';
set( handles.edit3,'Enable','off');
elseif ker_inx == 2;
ker = 'rbf';
set( handles.edit3,'Enable','on');
elseif ker_inx == 3;
ker = 'poly';
set( handles.edit3,'Enable','on');
else
ker = 'sigmoid';
set( handles.edit3,'Enable','on');
end
C_inx = get( handles.popupmenu3, 'Value' ); %获取C参数信息
if C_inx == 1;
C=10;
elseif C_inx == 2;
C=50;
else C=100;
end
switch get( handles.popupmenu1, 'Value' )
case 1
data=get(handles.axes1,'userdata');
options.solver = 'smo'; % 使用 SMO solver
options.ker = ker; % 使用核函数
options.arg = 1; % kernel argument
options.C = C; %调整参数
T1=cputime;
model = oaasvm(data,options ); % 训练
T=cputime-T1;%计算训练所用时间
set(handles.pushbutton6,'userdata',T);%将时间变量传递出去
%显示图形
axes(handles.axes1);cla;
ppatterns(data);
D=struct('solver',options.solver,'ker',options.ker,'arg',options.arg,'C',options.C,'model',model);
set(handles.pushbutton2,'userdata',D);
text=sprintf(...
['训练算法:OAA算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n'],...
ker,T);
case 2
data=get(handles.axes1,'userdata');
options.solver = 'smo';
options.ker = ker;
options.arg = 1;
options.C = C;
T1=cputime;
model = oaosvm(data,options);
T=cputime-T1;
set(handles.pushbutton6,'userdata',T);
axes(handles.axes1);cla;
ppatterns(data);
D=struct('solver',options.solver,'ker',options.ker,'arg',options.arg,'C',options.C,'model',model);
set(handles.pushbutton2,'userdata',D);
text=sprintf(...
['训练算法:OAO算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n'],...
ker,T);
case 3
data=get(handles.axes1,'userdata');
options.solver = 'smo'; % 使用 smo solver
options.ker = ker;
options.arg = 1;
options.C = C;
T1=cputime;
model = bsvm2(data,options); % training
T=cputime-T1;
set(handles.pushbutton6,'userdata',T);
% 显示图形
axes(handles.axes1);cla;
ppatterns(data);
D=struct('solver',options.solver,'ker',options.ker,'arg',options.arg,'C', options.C,'model',model);
set(handles.pushbutton2,'userdata',D);
text=sprintf(...
['训练算法:BSVM2算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n'],...
ker,T);
end
set( handles.edit1,'String', text );%将结果显示到注释窗口
%关闭窗口回调函数
function pushbutton5_Callback(hObject, eventdata, handles)
close(gcf);
%图象导出回调函数
function pushbutton6_Callback(hObject, eventdata, handles)
h=get(gcf,'CurrentAxes');
fig2jpg(h);
%计算SV回调函数
function pushbutton7_Callback(hObject, eventdata, handles)
data=get(handles.axes1,'userdata');
D=get(handles.pushbutton2,'userdata');
model=D.model;
axes(handles.axes1);cla;
nsv = model.nsv;%将训练算法中支持向量个数的变量nsv传递出来
time=get(handles.pushbutton6,'userdata');%将计算CPU时间参数T传递出来
ppatterns(data);
ppatterns(model.sv.X,'ko',12);
set(handles.pushbutton2,'userdata',D);
ker_inx = get( handles.popupmenu2, 'Value' ); %获取核函数信息
if ker_inx == 1;
ker = 'linear';
elseif ker_inx == 2;
ker = 'rbf';
elseif ker_inx == 3;
ker = 'poly';
else
ker = 'sigmoid';
end
%要输出的内容控制
if get( handles.popupmenu1, 'Value' )==1
text1=sprintf(...
['训练算法:OAA算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n',...
'支持向量的个数: %d\n'],...
ker,time,nsv );
elseif get( handles.popupmenu1, 'Value' )==2
text1=sprintf(...
['训练算法:OAO算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n',...
'支持向量的个数: %d\n'],...
ker,time,nsv );
else
text1=sprintf(...
['训练算法:BSVM2算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n',...
'支持向量的个数: %d\n'],...
ker,time,nsv );
end
set( handles.edit1,'String', text1 );
%决策边界回调函数
function pushbutton8_Callback(hObject, eventdata, handles)
data=get(handles.axes1,'userdata');
D=get(handles.pushbutton2,'userdata');
model=D.model;
axes(handles.axes1);cla;
ppatterns(data);
ppatterns(model.sv.X,'ko',12);
pboundary(model);
nsv = model.nsv;
time=get(handles.pushbutton6,'userdata');
trnerr = model.trnerr;%将训练算法中计算分类错误的参数传出
ker_inx = get( handles.popupmenu2, 'Value' ); %获取核函数信息
if ker_inx == 1;
ker = 'linear';
elseif ker_inx == 2;
ker = 'rbf';
elseif ker_inx == 3;
ker = 'poly';
else
ker = 'sigmoid';
end
if get( handles.popupmenu1, 'Value' )==1
text1=sprintf(...
['训练算法:OAA算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n',...
'支持向量的个数: %d\n',...
'分类错误率: %.2f%%'],...
ker,time,nsv ,100*trnerr);
elseif get( handles.popupmenu1, 'Value' )==2
text1=sprintf(...
['训练算法:OAO算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n',...
'支持向量的个数: %d\n',...
'分类错误率: %.2f%%'],...
ker,time,nsv ,100*trnerr );
else
text1=sprintf(...
['训练算法:BSVM2算法\n',...
'核函数: %s \n',...
'训练所费时间: %.6f\n',...
'支持向量的个数: %d\n',...
'分类错误率: %.2f%%'],...
ker,time,nsv,100*trnerr );
end
set( handles.edit1,'String', text1 );
%训练算法下拉菜单
function popupmenu1_Callback(hObject, eventdata, handles)
function popupmenu1_CreateFcn(hObject, eventdata, handles)
handles.popupmenu1=get(hObject,'Value');%将菜单选项值传出
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% 核函数下拉菜单
function popupmenu2_Callback(hObject, eventdata, handles)
function popupmenu2_CreateFcn(hObject, eventdata, handles)
handles.popupmenu2=get(hObject,'Value');%将菜单选项值传出
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% C惩罚系数下拉菜单
function popupmenu3_Callback(hObject, eventdata, handles)
function popupmenu3_CreateFcn(hObject, eventdata, handles)
handles.popupmenu3=get(hObject,'Value');%将菜单选项值传出
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%注释窗口
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% MENU设计及回调函数
%创建数据
function Untitled_2_Callback(hObject, eventdata, handles)
n=5;
createdata('finite',n,'created',gcf);
%装载数据
function Untitled_3_Callback(hObject, eventdata, handles)
h = waitbar(0,'Please wait...');
for i=1:100,
waitbar(i/100)
end
close(h)
data=get( gcf,'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.pushbutton2,'UserData',file);
cla;
data=loadsets(gcf);
set(gcf,'UserData',data);
set(data.edit1,'String','数据已经装载,请选择下一步 !');
else
errordlg('This file does not contain required data.','Bad file','modal');
end
end
% --------------------------------------------------------------------
function Untitled_1_Callback(hObject, eventdata, handles)
% 关闭
function Untitled_4_Callback(hObject, eventdata, handles)
close(gcf);
% --------------------------------------------------------------------
function Untitled_5_Callback(hObject, eventdata, handles)
% 调用OAA算法演示模型
function Untitled_6_Callback(hObject, eventdata, handles)
OAA_Multi_C_SVM;
% 调用OAO算法演示模型
function Untitled_7_Callback(hObject, eventdata, handles)
OAO_Multi_SVM;
% 调用BSVM2算法演示模型
function Untitled_8_Callback(hObject, eventdata, handles)
Multi_BSVM__L2_soft_margi
% --------------------------------------------------------------------
function Untitled_9_Callback(hObject, eventdata, handles)
% --------------------------------------------------------------------
function Untitled_10_Callback(hObject, eventdata, handles)
helpwin(mfilename);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -