- The green dots in Figure 21 represents new samples.
- In Figure 23, only new samples lying outside the margin is plotted (samples in cyan and magenta)
- In Figure 22, only new samples lying inside the margin is plotted.
SVM Separating hyperplane and its margin
14 views (last 30 days)
Show older comments
Nophi Ian Biton
on 10 Oct 2023
Answered: Githin George
on 23 Oct 2023
I am solving a classification problem using SVM specifically fitcsvm. I want to know how do I get the equation of the (a) separating hyperplane and (b) and equations of the margin.
My goal is to know whether a new sample (data_new, not added to the training set) is within the margin of separating hyperplane. BTW, im using gaussian kernel.
clc,clear; format compact; format shortG;
seed = 1;
rng(seed);
r = sqrt(rand(100,1)); % Radius
t = 2*pi*rand(100,1); % Angle
data1 = [r.*cos(t), r.*sin(t)]; % Points
r2 = sqrt(3*rand(100,1)+1); % Radius
t2 = 2*pi*rand(100,1); % Angle
data2 = [r2.*cos(t2), r2.*sin(t2)]; % points
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);
ylim([-2.5,2.5]); xlim([-2.5,2.5]); hold off
axis equal
data3 = [data1;data2];
theclass = ones(200,1);
theclass(1:100) = -1;
%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);
r_new = sqrt(1.0*rand(20,1)+0.5); % Radius
t_new = 2*pi*rand(20,1); % Angle
data_new = [r_new.*cos(t_new), r_new.*sin(t_new)]; % points
% Plot the data and the decision boundary
figure;
h(1:2) = gscatter(data3(:,1),data3(:,2),theclass,'rb','.'); hold on
ezpolar(@(x)1); ezpolar(@(x)2);
h(3) = plot(data3(cl.IsSupportVector,1),data3(cl.IsSupportVector,2),'ko'); hold on
h(4) = gscatter(data_new(:,1),data_new(:,2),ones(20,1),'g','.');
contour(x1Grid,x2Grid,reshape(scores(:,2),size(x1Grid)),[0 0],'k');
legend(h,{'-1','+1','Support Vectors','New samples'}, Location="northeast");
axis equal
ylim([-2.5,2.5]); xlim([-2.5,2.5]);
hold off
I am not exactly sure if this 'margin' function is proper to use.
Can anybody help or suggest how to do this?
0 Comments
Accepted Answer
Githin George
on 23 Oct 2023
Hello,
I understand you are trying to find the equations of the margins and separating hyperplanes for the SVM classifier, and you are using a ‘gaussian’ kernel. I also understand that the final objective here is to check whether a new sample point lies within the margin of separating hyperplane or not.
It is in fact a difficult task to obtain the equations of the separating hyperplane and margins, because the output of “fitcsvm” function will not have the beta values for a non-linear kernel like ‘gaussian’.
Alternatively, you could use “margin” function to compute the classification margins for each new sample and compare it to the max-margin of support vectors to filter out samples lying within the margin as shown in the code below:
labels = predict(cl,data_new);
m = margin(cl,data_new,labels);
maxMargin = max(margin(cl,cl.SupportVectors,cl.SupportVectorLabels));
indices = find(m < maxmargin);
figure;
h(1:2) = gscatter(data3(:,1),data3(:,2),theclass,'rb','.'); hold on
ezpolar(@(x)1); ezpolar(@(x)2);
h(3) = plot(data3(cl.IsSupportVector,1),data3(cl.IsSupportVector,2),'ko'); hold on
% PLOTTING NEW SAMPLES WITHIN THE 'MARGIN'
gscatter(data_new(indices,1),data_new(indices,2),labels(indices),'cm','.',20);
contour(x1Grid,x2Grid,reshape(scores(:,2),size(x1Grid)),[0 0],'k');
legend off;
axis equal
ylim([-2.5,2.5]); xlim([-2.5,2.5]);
hold off;
In the image below, I’ve plotted samples lying inside and outside the margins in separate figures.
You can clearly observe that “margin” function is proving helpful in this task.
I hope this helps.
0 Comments
More Answers (0)
See Also
Categories
Find more on Classification Ensembles in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!