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

📄 demo_svm.m

📁 SVM matlab GUI可视化界面 直观形象 代码解释比较详细 对GUI学习和svm学习都有帮助
💻 M
📖 第 1 页 / 共 2 页
字号:
   %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 + -