www.gusucode.com > 支持向量机的Matlab实现,支持多分类,据有GUI操作界面 > code11/MATLAB_svm_gui/visual/pboundary.m

    function varargout=pboundary(model,options)
% PBOUNDARY Plots decision boundary of given classifier in 2D.
%
% Synopsis:
%  h = pboundary(model)
%  h = pboundary(model,options)
%
% Description:
%  This function plots decision boundary of given classifier in 
%  2-dimensional feature space. The classification function
%  must be specified in the field model.eval. The decision
%  bounary is interpolated from the response of the classifier
%    y = feval( model.fun, X, model).
%
% Input:
%  model [struct] Model of classifier.
%   .fun [string] Classification function.
%  
%  options [struct] Controls visualization:
%   .gridx [1x1] Sampling density in x-axis (default 200).
%   .gridy [1x1] Sampling density in y-axis (default 200).
%   .line_style [string] Used line-style to plot decision boundary.
%   .fill [1x1] If 1 then the class regions are filled. 
%  
% Output:
%  h [1 x nobjects] Handles of used graphics objects.
%
% Example:
%  data = load('riply_trn');
%  figure; 
%  ppatterns(data);
%  pboundary( knnrule(data,1) );
%
% See also 
%  PPATTERNS, PLINE.
%

% About: Statistical Pattern Recognition Toolbox
% (C) 1999-2003, Written by Vojtech Franc and Vaclav Hlavac
% <a href="http://www.cvut.cz">Czech Technical University Prague</a>
% <a href="http://www.feld.cvut.cz">Faculty of Electrical Engineering</a>
% <a href="http://cmp.felk.cvut.cz">Center for Machine Perception</a>

% Modifications:
% 1-may-2004, VF
% 19-may-2003, VF

% process inputs
if nargin < 1, error('Not enough input arguments.'); end
model=c2s(model);

if nargin < 2, options=[]; else options=c2s(options); end
if ~isfield(options,'fill'), options.fill=0; end
if ~isfield(options,'gridx'), options.gridx = 200; end
if ~isfield(options,'gridy'), options.gridy = 200; end
if ~isfield(options,'line_style'), options.line_style = 'k'; end

% get hold option
old_hold = ishold;
hold on;

%
V = axis;
dx = (V(2)-V(1))/options.gridx;
dy = (V(4)-V(3))/options.gridy;

[X,Y] = meshgrid(V(1):dx:V(2),V(3):dy:V(4));

% make testing points
tst_data=[reshape(X',1,prod(size(X)));reshape(Y',1,prod(size(Y)))];

% classify points
D = feval( model.fun, tst_data, model );

h = plot_boundary( D, V(1):dx:V(2), V(3):dy:V(4), ...
    options.fill, options.line_style );

if ~old_hold, hold off; end

% return handles if required
if nargout > 0, varargout{1} = h; end

return;


% L=D; X_pos=V(1):dx:V(2); Y_pos=V(3):dy:V(4);fill_regions=options.fill;
% linestyle=options.line_style;
%-------------------------------------------------------
function h = plot_boundary( L, X_pos, Y_pos, fill_regions, linestyle )
% Plots decision boudary. 
%

dx=X_pos(2)-X_pos(1);
dy=Y_pos(2)-Y_pos(1);
m = length( X_pos );
n = length( Y_pos );

Z = NaN*ones( m+2, n+2 );
num_classes = max(L(:));

% mask=fspecial('gauss',[5 5],1) ; % fspecial is from images toolbox 
mask = [0.0030    0.0133    0.0219    0.0133    0.0030;
        0.0133    0.0596    0.0983    0.0596    0.0133;
        0.0219    0.0983    0.1621    0.0983    0.0219;
        0.0133    0.0596    0.0983    0.0596    0.0133;
        0.0030    0.0133    0.0219    0.0133    0.0030];

h = [];      
for i = 1:num_classes,
  
  A=L;
  A(find(L==i))=1;
  A(find(L~=i))=-1;
    
  A = reshape( A', m, n );
  A = filter2(mask, A);
   
  Z(2:end-1,2:end-1) = A;  
  
  [cc,tmp_h] = contour([X_pos(1)-dx,X_pos,X_pos(end)+dx],...
                   [Y_pos(1)-dy,Y_pos,Y_pos(end)+dy],Z',[-0 0],linestyle);  
  h = [h tmp_h(:)'];
  
  if fill_regions,
   while ~isempty(cc)
     len = cc(2,1);
     tmp_h = fill(cc(1,2:len+1),cc(2,2:len+1),marker_color(i));
     h = [h tmp_h(:)'];
     cc(:,1:len+1) = [];
   end  
  end
end

return;