我完成了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矩阵。
答案 0 :(得分:0)
如果您正在使用Bioinformatics Toolbox中的svmtrain
和svmclassify
命令,则可以使用其他输入参数(...'showplot', true)
,它将显示带有决策边界的散点图并突出显示支持向量。
如果您使用自己的SVM或第三方工具(如libSVM),您可能需要做的是:
meshgrid
命令contourf
。例如,在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值。在我们的场合,轮廓为我们提供了决策边界。
希望我帮助做得更清楚。您可以在以下链接中找到非常有用的信息和示例: