www.gusucode.com > stats 源码程序 matlab案例代码 > stats/NonlinearClassifierWithGaussianKernelExample.m

    %% Train SVM Classifiers Using a Gaussian Kernel
% This example shows how to generate a nonlinear classifier with Gaussian
% kernel function. First, generate one class of points inside the unit disk
% in two dimensions, and another class of points in the annulus from radius
% 1 to radius 2. Then, generates a classifier based on the data with the
% Gaussian radial basis function kernel. The default linear classifier is
% obviously unsuitable for this problem, since the model is circularly
% symmetric. Set the box constraint parameter to |Inf| to make a strict
% classification, meaning no misclassified training points. Other kernel
% functions might not work with this strict box constraint, since they
% might be unable to provide a strict classification. Even though the rbf
% classifier can separate the classes, the result can be overtrained.
%%
% Generate 100 points uniformly distributed in the unit disk. To do so,
% generate a radius _r_ as the square root of a uniform random variable,
% generate an angle _t_ uniformly in (0, $2\pi$ ), and put the point at
% (_r_ cos( _t_ ), _r_ sin( _t_ )).

% Copyright 2015 The MathWorks, Inc.

rng(1); % For reproducibility
r = sqrt(rand(100,1)); % Radius
t = 2*pi*rand(100,1);  % Angle
data1 = [r.*cos(t), r.*sin(t)]; % Points
%%
% Generate 100 points uniformly distributed in the annulus. The radius is
% again proportional to a square root, this time a square root of the
% uniform distribution from 1 through 4.
r2 = sqrt(3*rand(100,1)+1); % Radius
t2 = 2*pi*rand(100,1);      % Angle
data2 = [r2.*cos(t2), r2.*sin(t2)]; % points
%%
% Plot the points, and plot circles of radii 1 and 2 for comparison.
figure;
plot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
hold on
plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)
ezpolar(@(x)1);ezpolar(@(x)2);
axis equal
hold off
%%
% Put the data in one matrix, and make a vector of classifications.
data3 = [data1;data2];
theclass = ones(200,1);
theclass(1:100) = -1;
%%
% Train an SVM classifier with |KernelFunction| set to |'rbf'| and
% |BoxConstraint| set to |Inf|. Plot the decision boundary and flag the
% support vectors.

%Train the SVM Classifier
cl = fitcsvm(data3,theclass,'KernelFunction','rbf',...
    'BoxConstraint',Inf,'ClassNames',[-1,1]);

% Predict scores over the grid
d = 0.02;
[x1Grid,x2Grid] = meshgrid(min(data3(:,1)):d:max(data3(:,1)),...
    min(data3(:,2)):d:max(data3(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];
[~,scores] = predict(cl,xGrid);

% Plot the data and the decision boundary
figure;
h(1:2) = gscatter(data3(:,1),data3(:,2),theclass,'rb','.');
hold on
ezpolar(@(x)1);
h(3) = plot(data3(cl.IsSupportVector,1),data3(cl.IsSupportVector,2),'ko');
contour(x1Grid,x2Grid,reshape(scores(:,2),size(x1Grid)),[0 0],'k');
legend(h,{'-1','+1','Support Vectors'});
axis equal
hold off
%%
% |fitcsvm| generates a classifier that is close to a circle of radius 1.
% The difference is due to the random training data.
%%
% Training with the default parameters makes a more nearly circular
% classification boundary, but one that misclassifies some training data.
% Also, the default value of |BoxConstraint| is |1|, and, therefore, there
% are more support vectors.
cl2 = fitcsvm(data3,theclass,'KernelFunction','rbf');
[~,scores2] = predict(cl2,xGrid);

figure;
h(1:2) = gscatter(data3(:,1),data3(:,2),theclass,'rb','.');
hold on
ezpolar(@(x)1);
h(3) = plot(data3(cl2.IsSupportVector,1),data3(cl2.IsSupportVector,2),'ko');
contour(x1Grid,x2Grid,reshape(scores2(:,2),size(x1Grid)),[0 0],'k');
legend(h,{'-1','+1','Support Vectors'});
axis equal
hold off