等高线图 - X和Y值的2D形状

时间:2017-07-16 15:14:27

标签: python matplotlib scikit-learn

我绘制了一个等高线图,使用以下代码表示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=["--","-","--"])

enter image description here

问题

根据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还是原因是什么?

1 个答案:

答案 0 :(得分:1)

轮廓图不是为了为classfier绘制超平面而设计的。它代表具有2-D格式的3-D表面;或者它描绘了二维区域的高程。因此,plt.contour()必须以某种方式理解/了解覆盖整个区域的高程。一种方式或当前方式是为覆盖二维区域的一组点提供一组高程。并且您提供的越多,最终轮廓图越好/越好。提供1-D xy时,它表示一条线而不是一条区域,不能用于插入二维区域。

绘制超平面的另一种方法是自己计算精确的平面。然后,您可以绘制具有1-D线空间的超平面。但我不认为这比使用plt.contour()更容易,因为plt.contour()通过为您进行插值模拟来进行硬计算。

修改:Z如何与X中的Yplt.contour()合作?

Z使用XY需要一些假设。

  • 如果XY是2-D,则Z中的值是X中相应(按索引的位置相同)值指定的点的深度和Y
  • 如果XY是1-D,它将首先转换为网格网格,如the source code中所示。然后其余部分将以与上述相同的方式工作。

因此,对于您的具体情况,使用x_fity_fit可以为您提供相同的结果,因为plt.contour()为您制作网格网格。只要你了解机制,无论哪种方式都可以。我唯一要说的是,如果你最终还是使用meshgrid计算P,为什么不使用meshgrid来避免假设/模糊?