python中的Matplotlib.colors.ListedColormap

Vip*_*bey 2 machine-learning matplotlib

def plot_decision_regions(X, y, classifier, resolution=0.02):
    # setup marker generator and color map
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    # plot the decision surface
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
        np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())
    # plot class samples
    for idx, cl in enumerate(np.unique(y)):
    plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8, 
 c=cmap(idx),marker=markers[idx], label=cl)
Run Code Online (Sandbox Code Playgroud)

我正在从python机器学习中进行机器学习的感知器训练,发现了这段代码。在函数参数分类器中代表感知器,X是输入特征y是输出向量。我不明白ListedColormap的作用是什么?网状网格呢?我是熊猫matplotlib库的新手,请向我解释此代码以及我们要在此代码中做什么?

小智 11

让我解释一下代码的每一行:

x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1

x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

这部分代码涉及在图中创建我们的限制。为了使图形不那么笨拙和清晰,上限增加1,下限减少1。这有助于我们的分类模型不接触轴以防万一。

xx1,xx2 = np.meshgrid(np.arange(x1_min,x1_max,分辨率),np.arange(x2_min,x2_max,分辨率))

numpy 中的 meshgrid 方法使用坐标向量创建坐标矩阵。在这里,概括地说,形成了一个矩形(网格),其长度为 x1_max-x1_min,宽度为 x2_max-x2_min。

np.arange(start,stop,step):这里设置开始和结束,分辨率作为步长。如果分辨率大于 0.02(可能是 2),则绘制的点对人眼清晰可见。为了创建一个完全平滑的区域,分辨率被设置为必要的最低限度。

如果你有坐标

(-1,-2) (-1,0) (-1,1)

(0,-2) (0,0) (0,1)

(1,-2) (1,0) (1,1)

然后 meshgrid 方法将其转换为 2 个 3X3 矩阵

xx1 = [-1 -1 -1][0 0 0] [1 1 1](3X3 矩阵)

xx2 = [-2 -2 -2][0 0 0] [1 1 1](3X3 矩阵)

进入下一步,

Z =classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z = Z.reshape(xx1.shape)

numpy 的 .ravel() 方法,在这里创建一个扁平的一维数组。如上例所示,

xx1.ravel() = [-1 -1 -1 0 0 0 1 1 1]

xx2.ravel() = [-2 -2 -2 0 0 0 1 1 1]

numpy.array() 将两个向量连接成一个 2 X 9 数组:

这给,

[-1 -1 -1 0 0 0 1 1 1][-2 -2 -2 0 0 0 1 1 1] (2X9 矩阵)

对于这个矩阵,使用 .T,找到转置。当转置完成时,这将返回一个 9x2 矩阵。其中每一行代表一个坐标对。这个获得的矩阵被重新整形。

plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)

plt.xlim(xx1.min(), xx1.max())

plt.ylim(xx2.min(), xx2.max())

contourf 用于绘制等高线图。在这里,Z 在 xx1 x xx2 的空间中形成我们的分类器。并分配了绘图限制。

最后,

对于 idx, cl in enumerate(np.unique(y)):

plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8,

c=cmap(idx),marker=markers[idx],label=cl)

在这部分中,绘制了可用的数据点。

np.unique() 返回一个唯一值矩阵。如果您的模型有 2 个输出,即是或否,则整个数据分为 2 类。

enumerate() 方法返回计数和值。例如:

元素 = ('foo', 'bar', 'baz')

对于计数,枚举中的元素(元素)

...打印计数,元素

...

0 富

1 条

2巴兹

因此,在上面的代码中,idx 为所有带有“no”的点返回 0,或者对于带有“yes”的所有点返回 1。从

cmap = ListedColormap(colors[:len(np.unique(y))]), cmap(0) 返回该类别下所有分散点的第一种颜色。

当执行循环时,属于特定类别的所有数据点都被分配相同的颜色并绘制在图中。

Label 创建一个条形,使我们能够知道特定颜色所指的值。

这就是分类器通常是如何可视化的。


Imp*_*est 5

ListedColormap是具有列出的颜色的颜色图。这样的色图可用于显示离散的色阶,例如在图像图(imshowpcolormesh),其他2D图(例如)tripcolor或散点图中。同样,contour绘图可以采用颜色图,而使用a ListedColormap只是一个选项,您必须以不同的颜色显示不同的轮廓线级别。

如果您已经有颜色列表,则也可以直接将此颜色列表用于轮廓图。这两个选项均可用,在这种情况下,颜色图的优点仅在于您可以轻松地为绘图创建颜色栏。

请参见下面的内容,以直接使用颜色列表和使用颜色图之间进行比较。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

x = np.linspace(-3,3)
X,Y = np.meshgrid(x,x)
Z = np.exp(-(X**2+Y**2))
fig, (ax, ax2) = plt.subplots(ncols=2)

colors=["red", "orange", "gold", "limegreen", "k", 
        "#550011", "purple", "seagreen"]

ax.set_title("contour with color list")
contour = ax.contourf(X,Y,Z, colors=colors)

ax2.set_title("contour with colormap")
cmap = matplotlib.colors.ListedColormap(colors)
contour = ax2.contourf(X,Y,Z, cmap=cmap)
fig.colorbar(contour)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您会观察到两种情况之间的行为略有不同,即颜色列表根据给定的列表将一个级别的颜色着色为另一个级别,而颜色图将最小值和最大值之间的范围映射到颜色图,从而第一个和第二个最后的颜色肯定在图中,但是中间颜色(在这种情况下为“ limegreen”)被省略了,因为我们比颜色列表中的颜色少一级。