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);