www.gusucode.com > SVM matlab GUI可视化界面源码程序 > code/visual/psvm.m
function varargout=psvm(model,options) % 画出二元SVM分类器的决策边界以及决策分类面 % % 说明: % 这个函数画出在SVM中数据集在二维特征空间中的决策函数f(x), % 画出f(x)=0,以及f(x)=+1 和 f(x)=-1 % 输入: % model [struct] 二元SVM分类器模型: % .Alpha [1 x nsv] 拉格朗日乘子 % .b [real] 决策函数的偏差 % .sv.X [dim x nsv] 支持矢量 % .options.ker [string] 定义核函数 % .options.arg [1 x nargs] 核变量 % % options [struct] 版面控制: % .background [1x1] 若为1,则由决策函数控制背景颜色,默认值设为0 % .sv [1x1] 若为1,标记支持矢量,默认值设为1 % .sv_size [1x1] 标记的大小 % .margin [1x1] 若为1,则显示分类间隔,默认值设为1 % .gridx [1x1] x轴网格大小设置,默认值为 25 % .gridy [1x1] y轴网格大小设置,默认值为 25 % .color [int] 分类边界的颜色,默认值为'k'(黑色) % % 输出: % h [struct] 绘图对象句柄 % % 处理输入变量 %若没有输入变量options,则设置options的默认值 if nargin < 2, options=[]; else options=c2s(options); end %函数c2s将单元数组转化成结构体 if ~isfield(options,'background'), options.background = 0; end if ~isfield(options,'sv'), options.sv = 1; end if ~isfield(options,'margin'), options.margin = 1; end if ~isfield(options,'gridx'), options.gridx = 25; end if ~isfield(options,'gridy'), options.gridy = 25; end if ~isfield(options,'sv_size'), options.sv_size = 12; end if ~isfield(options,'color'), options.color = 'k'; end % 输出句柄变量 h = []; % 获取axis句柄 a = axis; old_hold = ishold; hold on; % 画支持矢量,'ok'表示用黑色小圈画出 if options.sv, h.sv = ppatterns(model.sv.X,'ok' ,options.sv_size); end % 当前图形窗口的区间 xmin=a(1); xmax=a(2); ymin=a(3); ymax=a(4); % 绘制三维网格曲面 [X,Y] = meshgrid(xmin:(xmax-xmin)/options.gridx:xmax,... ymin:(ymax-ymin)/options.gridy:ymax); % 生成样本,函数reshape选择数组X、Y中的一部分,重新建立数组;函数prod计算数组元素的乘积 tst_data=[reshape(X',1,prod(size(X)));reshape(Y',1,prod(size(Y)))]; % 分类 [pred_labels, dec_fun] = svmclass(tst_data,model); % 计算颜色 l=(-min(dec_fun)+max(dec_fun))/2; % 选择矩阵dec_fun的部分,重新建立矩阵 Z = reshape(dec_fun,size(X,1),size(X,2))'; % 设置背景色 if options.background, h.background = pcolor(X,Y,Z); end % 使颜色明暗平滑 shading interp; % 画出决策边界 [dummy,h.boundary] = contour(X,Y,Z,[0,0],options.color); % 画出分类间隔 if options.margin, [dummy,h.margin_plus] = contour(X,Y,Z,[1,1],[options.color,'--']); [dummy,h.margin_minus] = contour(X,Y,Z,[-1,-1],[options.color,'--']); end % 设置颜色 if options.background, set(h.background, 'LineStyle','none' ); set(gca,'Clim',[-l l]); % 创建颜色映射 g=gray(64); cmp=[g(33:end,:);flipud(g(33:end,:))];%函数flipud将每列元素都颠倒 cmp(1:32,1)=cmp(1:32,1)/2; cmp(1:32,3)=cmp(1:32,3)/2; cmp(33:end,3)=cmp(33:end,3)/2; colormap(cmp) end if ~old_hold, hold off; end if nargout >= 1, varargout{1} = h; end return;