📄 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -