www.gusucode.com > 支持向量机的Matlab实现,支持多分类,据有GUI操作界面 > code11/MATLAB_svm_gui/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);