这些命令在数字数据集聚类演示中起什么作用?

what do these commands do in the digits dataset clustering demonstration?

我一直在研究 Python 教程 here 上的将数字数据集拟合到 k 均值聚类的方法,其中一些代码让我感到困惑。

我理解这部分,我们需要使用 10 个集群来训练我们的模型。

from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape

kmeans = KMeans(n_clusters=10, random_state=0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape

下面向我们展示了控制台上 10 个簇质心的输出。 它首先创建有两行的图形和轴,每行有 5 个轴子图 return 图形和 (8,3) 是控制台上显示的图形的大小。 但在那之后我就是不明白该命令如何在 for 循环中显示簇质心的输出。

fig, ax = plt.subplots(2, 5, figsize=(8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
    axi.set(xticks=[], yticks=[])
    axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary)

此外,这部分是为了检查聚类在查找数据中的相似数字时的准确性。我知道我们需要创建一个标签,其大小与填充零的集群相同,以便我们可以将预测的标签放在那里。 但同样,我只是不明白他们是如何在 for 循环中实现它的。

from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
    mask = (clusters == i)
    labels[mask] = mode(digits.target[mask])[0]

有人可以解释一下每一行命令的作用吗?谢谢。

问题 1:代码如何绘制质心?

重要的是要看到每个质心都是特征中的一个点 space。换句话说,质心看起来像训练样本之一。在这种情况下,每个训练样本都是一个 8 × 8 的图像(尽管它们已经被展平成具有 64 个元素的行(因为 sklearn 总是希望输入 X 是一个 two-dimensional 数组) .所以每个质心也代表一个8×8的图像

循环跨越轴(一个 2 × 5 矩阵)和质心(kmeans.cluster_centers_ 一起。zip 的目的是确保对于每个 Axes 对象是对应的center(这是将一堆n的东西绘制成一堆n的子图的常用方法)。 centroids 已被重塑为 10 × 8 × 8 数组,因此 10 个 centroids 中的每一个都是我们期望的 8 × 8 图像。

由于每个质心现在都是一个二维数组,您可以使用 imshow 绘制它。

问题2:代码是如何分配标签的?

最简单的方法可能是将代码拆开,然后 运行 自行分解代码。例如,看看 clusters == 0。这是一个布尔数组。您可以使用布尔数组来索引相同形状的其他数组。循环中的第一行代码将这个数组分配给 mask 所以我们可以使用它。

然后我们使用布尔数组(试试吧!)对 labels 进行索引,“将这些值更改为标签向量相应元素的众数平均值,即 digits.target。 “由于 scipy.stats.mode() 函数 returns(再次尝试),索引 [0] 是必需的。