0

我完成了一次 SVM 训练,得到了 X、Y 之类的数据。X 是只有 2 维的特征矩阵,Y 是分​​类标签。因为数据只有二维,所以我想画一个决策边界来显示支持向量的表面。

我在 Matlab 中使用 contouf 来解决这个问题,但真的很难理解如何使用该函数。

我写道:

#1 try:    
contourf(X);

#2 try:
contourf([X(:,1) X(:,2) Y]);

#3 try:
Z(:,:,1)=X(Y==1,:);
Z(:,:,2)=X(Y==2,:);
contourf(Z);

所有这些事情都不正确。而且我查了Matlab的帮助文件,大部分都是把Z当作一个函数,所以我真的不知道如何形成正确的Z矩阵。

4

2 回答 2

0

如果您使用来自 Bioinformatics Toolbox的svmtrainand命令,您可以只使用附加的输入参数,它将显示带有决策边界和突出显示支持向量的散点图。svmclassify(...'showplot', true)

如果您使用自己的 SVM 或第三方工具(如 libSVM),您可能需要做的是:

  1. meshgrid使用命令在 2D 输入特征空间中创建点网格
  2. 使用经过训练的 SVM 对这些点进行分类
  3. 使用 绘制点网格和分类contourf

例如,在 kind-of-MATLAB-but-pseudocode 中,假设您的输入特征称为 X1 和 X2:

numPtsInGrid = 100;
x1Range = linspace(x1lower, x1upper, numPtsInGrid);
x2Range = linspace(x2lower, x2upper, numPtsInGrid);
[X1, X2] = meshgrid(x1Range, x2Range);
Z = classifyWithMySVMSomehow([X1(:), X2(:)]);
contourf(X1(:), X2(:), Z(:))

希望有帮助。

于 2013-02-18T16:44:57.013 回答
0

我知道已经有一段时间了,但我会试一试,以防其他人提出这个问题。

假设我们有一个 2D 训练集来训练一个 SVM 模型,换句话说,特征空间是一个 2D 空间。我们知道核 SVM 模型会导致以下形式的得分(或决策)函数:

f(x) = sum i=1 to N ( a i y i k( x , x i )) + b

其中 N 是支持向量的数量,x i是第i个支持向量,a i是估计的拉格朗日乘数, y i是相关的类标签。决策函数的值(分数)以方式描述了观察x与决策边界的距离。

现在假设对于 2D 特征空间中的每个点 (X,Y),我们都可以找到决策函数的相应分数。我们可以在 3D 欧几里得空间中绘制结果,其中 X 对应于第一个特征向量f1的值,Y 对应于第二个特征f2的值,Z 对应于每个点 (X,Y) 的决策函数的返回。这个 3D 图形与 Z=0 平面的交点为我们提供了进入二维特征空间的决策边界。换句话说,假设决策边界由分数等于 0 的 (X,Y) 点形成。看起来合乎逻辑吧?

现在在 MATLAB 中,您可以轻松地做到这一点,首先在 X,Y 空间中创建一个网格:

d = 0.02;
[x1Grid,x2Grid] = meshgrid(minimum_X:d:maximum_X,minimum_Y:d:maximum_Y);

d根据所需的网格分辨率选择。

然后对于经过训练的模型SVMModel找到每个网格点的分数:

xGrid = [x1Grid(:),x2Grid(:)];
[~,scores] = predict(SVMModel,xGrid);

最后绘制决策边界

figure;
contour(x1Grid,x2Grid,reshape(scores(:,2),size(x1Grid)),[0 0],'k');

等高线为我们提供了一个 2D 图形,其中有关第 3 维的信息在 2D 平面中被描绘为实线。这些线表示等响应值,换句话说,具有相同 Z 值的 (X,Y) 点。在我们的场合,轮廓给了我们决策边界。

希望我能帮助让这一切更清楚。您可以在以下链接中找到非常有用的信息和示例:

MATLAB 的例子

3D 空间中决策函数的表示

于 2017-03-25T10:19:23.620 回答