ValueError:尝试绘制 SVM 时 x 和 y 的大小必须相同

Posted

技术标签:

【中文标题】ValueError:尝试绘制 SVM 时 x 和 y 的大小必须相同【英文标题】:ValueError: x and y must be the same size when try to draw the SVM 【发布时间】:2021-08-17 22:37:17 【问题描述】:

我是机器学习的新手,我发现 python 代码可以从 python 中的 sklearn 中查看 SVM 模型的结果 代码是

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets.samples_generator import make_blobs

X,y=make_blobs(n_samples=40,centers=2,random_state=20)

clf=svm.SVC(kernel='linear',C=1000)
clf.fit(X,y)

plt.scatter(X[:,0],X[:,1],c=y,s=30,cmap=plt.cm.Paired)

### assign new data
newData=[[3,4],[5,6]]

#print(clf.predict(newData))
#plot the deciston function
ax=plt.gca()
xlim=ax.get_xlim()
ylim=ax.get_ylim()

#creat a grid to evalute the modle
xx=np.linspace(xlim[0],xlim[1],30)
yy=np.linspace(ylim[0],ylim[1],30)
YY,XX=np.meshgrid(yy,xx)
xy=np.vstack([XX.ravel(),YY.ravel()]).T
Z=clf.decision_function(xy).reshape(XX.shape)

#plot decision bundray and margins
ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])
# plot support vector
ax.scatter(clf.support_vectors_[:0],clf.support_vectors_[:1],s=100,linewidths=1,facecolors='none')
plt.show()

当我运行上面的代码时,我得到了这个错误:

文件“C:/Users/Black_Swan/PycharmProjects/test/images/svm.py”,第 47 行,在 ax.scatter(clf.support_vectors_[:0],clf.support_vectors_[:1],s=100,linewidths=1,facecolors='none') 文件“C:\Python27\lib\site-packages\matplotlib_init_.py”,第 1870 行,在内部 返回函数(ax,*args,**kwargs) 文件“C:\Python27\lib\site-packages\matplotlib\axes_axes.py”,第 4257 行,分散 raise ValueError("x 和 y 的大小必须相同") ValueError:x 和 y 的大小必须相同

谁能帮我找出错误?

【问题讨论】:

【参考方案1】:

.scatter() 函数采用 xy 坐标的浮点或类似数组。由于这些是坐标,它们应该成对出现,因此 xy 应该是相等的长度。 在您的代码中,xclf.support_vectors_[:0]yclf.support_vectors_[:1]。语法iterator[:k] 表示我们应该选择迭代器中的每个元素,直到我们不应该选择的第 k 个元素。 因此,当我们将这些东西组合在一起时,我们可以发现 xy 的长度不同,因此会引发错误。

【讨论】:

【参考方案2】:

clf.support_vectors_ 是一个二维数组,所以你需要做 clf.support_vectors_[:,0] 。不太确定您的 matplotlib 版本,我使用的是“3.4.1”,因此以下解决方案适用于该版本:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs

X,y=make_blobs(n_samples=40,centers=2,random_state=20)

clf=svm.SVC(kernel='linear',C=1000)
clf.fit(X,y)

fig,ax = plt.subplots()
ax.scatter(X[:,0],X[:,1],c=y,s=20,cmap=plt.cm.Paired)

newData=[[3,4],[5,6]]

ax=plt.gca()
xlim=ax.get_xlim()
ylim=ax.get_ylim()

#creat a grid to evalute the modle
xx=np.linspace(xlim[0],xlim[1],30)
yy=np.linspace(ylim[0],ylim[1],30)
YY,XX=np.meshgrid(yy,xx)
xy=np.vstack([XX.ravel(),YY.ravel()]).T
Z=clf.decision_function(xy).reshape(XX.shape)

ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])
ax.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],marker='o',
           edgecolors="black",s=90,c="None",linewidths=2)

【讨论】:

以上是关于ValueError:尝试绘制 SVM 时 x 和 y 的大小必须相同的主要内容,如果未能解决你的问题,请参考以下文章

无法理解 SVM 和 LR 中决策边界的绘制

绘制图像的傅立叶变换时出现问题。 “ValueError:x 和 y 不能大于 2-D,但具有 (2592,) 和 (2592, 1, 3) 形状”

朴素贝叶斯和 SVM 分类 - 如何在 x y 轴上绘制精度?

尝试使用 Seaborn 从 DataFrame 列绘制单变量分布时,“ValueError:无法一起广播操作数”

当我尝试绘制决策边界时形状错误

ValueError:未知标签类型:SVM 中的“连续”错误