ValueError: x and y must be the same size when try to draw the SVM

ValueError: x and y must be the same size when try to draw the SVM

我是机器学习的新手,我在 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()

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

File "C:/Users/Black_Swan/PycharmProjects/test/images/svm.py", line 47, in ax.scatter(clf.support_vectors_[:0],clf.support_vectors_[:1],s=100,linewidths=1,facecolors='none') File "C:\Python27\lib\site-packages\matplotlib_init_.py", line 1870, in inner return func(ax, *args, **kwargs) File "C:\Python27\lib\site-packages\matplotlib\axes_axes.py", line 4257, in scatter raise ValueError("x and y must be the same size") ValueError: x and y must be the same size

谁能帮我找出错误?

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

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)