我做了一个支持向量机代码,我想用 Z 轴上的内核绘制散点图。
首先,这是我的代码。
% Clear
clear all
close all
% Test data and labels y
X = [1 2; 1 1; 2 1; 7 7; 8 7; 7 8];
y = [1;1;1;-1;-1;-1];
% How many labels
m = size(y, 1);
% Polynomial kernel 2:nd
K = @(x1,x2) (1 + x1*x2').^2;
% Construct the gram-matrix Q
Q = zeros(m,m);
for i = 1:m
for j = 1:m
Q(i,j) = y(i)*y(j)*K(X(i,:), X(j,:));
end
end
% Create QP-solution
c = -ones(m, 1);
A = y';
b = 0;
[x, solution] = quadprog(Q, c, A, b);
% Create bias and weights for the hyper plane
epsilon = 1e-6;
sv_idx = find(x > epsilon);
b = mean(y(sv_idx) - X(sv_idx,:)*X'*diag(y)*x);
w = X'*diag(y)*x;
% Create the hyper plane
[x1, x2] = meshgrid(min(X(:, 1)):max(X(:, 1)), min(X(:, 2)):max(X(:, 2)));
z = zeros(size(x1));
for i = 1:size(x1,1)
for j = 1:size(x2,2)
z(i,j) = -w(1)*x1(i,j) - w(2)*x2(i,j) - b;
end
end
% Plot the hyper plane
surf(x1, x2, z, 'EdgeColor','none');
view(3);
% Plot the measurements
hold on
scatter3(X(:,1), X(:,2), y, 50, y, 'filled');
函数quadprog可以在这里找到。
我有一个名为
X
的矩阵。它有 6
行和 2
列。每一行都是一个测量值,y
确定它是 1
类还是 -1
类。换句话说,类标签。
X
的问题是它在第二个维度上,我需要把它放到第三个维度上 3D。因此,我可以使用内核为我的矩阵X
提供另一列数据。
K = @(x1,x2) (1 + x1*x2').^2;
但问题是
K
是一个矩阵,而不是extra
的X
列。正如您在此处看到的那样,这使得绘制我的散点数据变得更加困难。
scatter3(X(:,1), X(:,2), y, 50, y, 'filled');
当我绘制
scatter3
时,测量值放置在 exactly
-1
到 1
远离超平面,因为 y
只包含负值和正值。
问题:
如果我有一个矩阵
X
,由于二次规划过程,我将其转换为Q
。但我需要绘制散点图的深度,而不仅仅是使用 -1
和 1
作为 Z 轴值。
如何得到散点图的
deepth
?我需要为 Z 轴设置正确的值。
如果你不知道什么是支持向量机,那么这张图解释了有一个超平面将两个不同的类分开。