如何使用matlab contourf绘制二维决策边界

时间:2013-02-17 15:48:40

标签: matlab contour

我完成了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矩阵。

2 个答案:

答案 0 :(得分:0)

如果您正在使用Bioinformatics Toolbox中的svmtrainsvmclassify命令,则可以使用其他输入参数(...'showplot', true),它将显示带有决策边界的散点图并突出显示支持向量。

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

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

    例如,在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(:))
    

    希望有所帮助。

答案 1 :(得分:0)

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

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

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

其中N是支持向量的数量, x i i -th支持向量, a i 是估计的拉格朗日乘数, y i 是相关的类标签。决策函数的值(分数)用于描述决策边界的观察距离 x

现在假设对于2D特征空间中的每个点(X,Y),我们可以找到决策函数的相应分数。我们可以在3D欧几里德空间中绘制结果,其中X对应于第一特征向量 f 1 的值,Y对应于第二特征 f 2 ,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');

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

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

MATLAB's example

Representation of decision function in 3D space