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