解释matplotlib contourf函数

Explain matplotlib contourf function

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

subplot.contourf(x2, y2, P, cmap=cmap_light, alpha = 0.8)

其中 x2 和 y2 是通过 numpy meshgrids 生成的两个二维矩阵。 P 是使用

计算的
P = clf.predict(numpy.c_[x2.ravel(), y2.ravel()])
P = P.reshape(x2.shape) 

P的每个元素都是基于逻辑回归输出的布尔值。渲染图看起来像这样

我的问题是 contourf 函数如何根据布尔值的二维矩阵知道在哪里绘制轮廓?(x2,y2 只是 numpy 网格)我查了一下文档看了好几遍还是看不懂

为了说明发生了什么,下面是一个使用鸢尾花数据集的前 2 个特征(萼片长度和宽度)的示例。

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

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

由于网格点及其预测未在问题图中可视化,因此难以理解突然出现的轮廓。

from matplotlib import pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

X, y = load_iris(return_X_y=True)
X = X[:, :2]
clf = LogisticRegression(random_state=0).fit(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='Given values')
plt.contourf(x2, y2, pred.reshape(x2.shape), cmap=cmap, alpha=0.4, levels=2, zorder=0)
plt.legend(ncol=2, loc="lower center", bbox_to_anchor=(0.5,1.01))
plt.show()

PS:关于pred.reshape(x2.shape)

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