【问题标题】:Explain matplotlib contourf function解释 matplotlib contourf 函数
【发布时间】:2020-11-23 18:58:25
【问题描述】:

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

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

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

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

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

我的问题是,contourf 函数如何知道根据布尔值的 2D 矩阵在哪里绘制轮廓?(x2、y2 只是 numpy meshgrids)我查了几次文档,但是听不懂。

【问题讨论】:

    标签: python matplotlib scikit-learn logistic-regression


    【解决方案1】:

    为了说明正在发生的事情,这里是一个使用虹膜数据集的2个第一个特征(Sepal Length和Width)的示例。

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

    最后一步是使用这些网格点作为输入以搜索具有相等预测值的区域的轮廓。因此,contour line在具有值0的网格点和具有值1之间的网格点之间绘制。contourf 987654324 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)

    • @ 987654327和y2是给出每个网格点的x和y坐标的阵列。 x2y2组织为2d阵列,类似于它们所代表的网格(示例中的20x020)。
    • clf.predict 987654331 @需要输入阵列为1D。为此,使用了.ravel()在该示例中,ravel将20x20阵列转换为400的1d阵列。
    • pred = clf.predict是相应的1D阵列(400元素)。
    • pred.reshape(x2.shape)转换predx2y2(再次20x20)。
    • 请注意,scatter希望其参数以1D格式,只需单独查看每个点。 contourf另一方面,以2D格式的参数为单位,因为它需要知道网格如何组织。

    【讨论】:

    • 它是包含有关哪个网格点的信息的pred.reshape(x2.shape)参数。这就是我最初与之混淆的。 span>
    • 我更新了reshape(x2.shape)x2.ravel()的动机答案。 span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多