Python 解释matplotlib轮廓函数

Python 解释matplotlib轮廓函数,python,matplotlib,scikit-learn,logistic-regression,Python,Matplotlib,Scikit Learn,Logistic Regression,我试图用matplotlib轮廓函数绘制一个决策区域(基于逻辑回归的输出)。我正在使用的代码: subplot.contourf(x2, y2, P, cmap=cmap_light, alpha = 0.8) 其中x2和y2是通过numpy网格生成的两个二维矩阵。P是使用 P = clf.predict(numpy.c_[x2.ravel(), y2.ravel()]) P = P.reshape(x2.shape) p的每个元素都是基于逻辑回归输出的布尔值。渲染的绘图如下所示 我的问

我试图用matplotlib轮廓函数绘制一个决策区域(基于逻辑回归的输出)。我正在使用的代码:

subplot.contourf(x2, y2, P, cmap=cmap_light, alpha = 0.8)
其中x2和y2是通过numpy网格生成的两个二维矩阵。P是使用

P = clf.predict(numpy.c_[x2.ravel(), y2.ravel()])
P = P.reshape(x2.shape) 
p的每个元素都是基于逻辑回归输出的布尔值。渲染的绘图如下所示


我的问题是,contourf函数如何知道根据布尔值的2D矩阵在何处绘制轮廓?(x2、y2只是numpy网格)我查阅了几次文档,但无法理解。

为了说明发生了什么,下面是一个使用两个第一特征(萼片长度和宽度)的示例iris数据集的一部分

首先,根据给定数据(黑色轮廓点)计算回归。然后,对于覆盖数据的网格的每个点,计算预测(网格中的小点)。请注意,给定值和预测值只是数字0、1和2。(在问题中,仅使用0和1。)

最后一步是使用这些网格点作为输入,搜索预测值相等的区域轮廓。因此,在值为0的栅格点和值为1的栅格点之间绘制。另一个介于值1和2之间。
contourf
用统一的颜色填充线条之间的区域

由于网格点和它们的预测在问题的情节中没有可视化,因此突然出现的轮廓更难理解

从matplotlib导入pyplot作为plt
将numpy作为np导入
从sklearn.dataset导入加载
从sklearn.linear_模型导入逻辑回归
十、 y=加载虹膜(返回X\U y=真)
X=X[:,:2]
clf=逻辑回归(随机状态=0).拟合(X,y)
x2,y2=np.meshgrid(np.linspace(X[:,0].min()-.5,X[:,0].max()+.5,20),
np.linspace(X[:,1].min()-.5,X[:,1].max()+.5,20))
pred=clf.predict(np.c_x2.ravel(),y2.ravel())
cmap=plt.get_cmap('Set1',3)
plt.scatter(x2.ravel(),y2.ravel(),c=pred,s=10,cmap=cmap,label='Prediction on grid')
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=cmap,ec='black',label='给定值')
plt.contourf(x2,y2,预整形(x2.shape),cmap=cmap,alpha=0.4,Level=2,zorder=0)
plt.图例(ncol=2,loc=“下中心”,bbox\U至\U锚=(0.5,1.01))
plt.show()

PS:About
pred.reformate(x2.shape)

  • x2
    y2
    是给出每个网格点的x和y坐标的数组
    x2
    y2
    被组织为2D数组,类似于它们所表示的网格(示例中为20x020)
  • 但是,函数
    clf.predict
    需要其输入数组为1d。为此,我们使用了
    .ravel()
    :它只是从2d数组中生成一个长的1d数组。在本例中,
    ravel
    将20x20阵列转换为400的1d阵列
  • pred=clf.predict的结果是一个对应的1d数组(400个元素)
  • pred.reformate(x2.shape)
    pred
    转换为与
    x2
    y2
    相同的2d格式(同样是20x20)
  • 请注意,
    scatter
    希望其参数为1d格式,它仅单独查看每个点<另一方面,code>contourf
    希望其参数为2d格式,因为它需要知道网格是如何组织的

是pred.reformate(x2.shape)参数,它包含关于哪个网格点具有什么值(0、1或2)的信息。这就是我最初混淆的地方。我更新了答案,动机是
重塑(x2.shape)
x2.ravel()