我绘制了一个等高线图,使用以下代码表示SVC估算器在2D轴上的分离超平面。
X,y= make_circles(n_samples=50,factor=.1,noise=.1)
x_fit=np.linspace(-1.5,1.5,10)
y_fit=np.linspace(-1.5,1.5,10)
Y,XX=np.meshgrid(x_fit,y_fit)
xy=np.vstack([XX.ravel(),Y.ravel()]).T
P=clf.decision_function(xy).reshape(XX.shape)
plt.contour(XX,Y,P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
问题
根据this question和Ilya V. Schurov的回答,对我来说还有一个问题。我理解,X和Y提供x和y值,Z为每个xy坐标提供“深度”,因此必须是2维。此外,plt.contour()函数的X和Y值可以是1D或2D(如果1D网格网格在内部计算)。
但是X和Y成为2D的好处/原因是什么? 因为实际上X和Y的“第二维”不能在2D轴上绘制。那么X和Y的某些“算法性能”原因是2D还是原因是什么?
答案 0 :(得分:1)
轮廓图不是为了为classfier绘制超平面而设计的。它代表具有2-D格式的3-D表面;或者它描绘了二维区域的高程。因此,plt.contour()
必须以某种方式理解/了解覆盖整个区域的高程。一种方式或当前方式是为覆盖二维区域的一组点提供一组高程。并且您提供的越多,最终轮廓图越好/越好。提供1-D x
和y
时,它表示一条线而不是一条区域,不能用于插入二维区域。
绘制超平面的另一种方法是自己计算精确的平面。然后,您可以绘制具有1-D线空间的超平面。但我不认为这比使用plt.contour()
更容易,因为plt.contour()
通过为您进行插值模拟来进行硬计算。
Z
如何与X
中的Y
和plt.contour()
合作? Z
使用X
和Y
需要一些假设。
X
和Y
是2-D,则Z
中的值是X
中相应(按索引的位置相同)值指定的点的深度和Y
。X
和Y
是1-D,它将首先转换为网格网格,如the source code中所示。然后其余部分将以与上述相同的方式工作。因此,对于您的具体情况,使用x_fit
和y_fit
可以为您提供相同的结果,因为plt.contour()
为您制作网格网格。只要你了解机制,无论哪种方式都可以。我唯一要说的是,如果你最终还是使用meshgrid计算P
,为什么不使用meshgrid来避免假设/模糊?