Menu
CoddyTech

为聚类命名

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 46 课,共 51 课。

簇只有编号,没有名称。现在你可以使用标签:交叉表会统计每个簇中各个数字的数量,例如这 3 个簇中的 1、7 和 9:

一个 3 × 3 的计数表,行是簇,列是数字 1、7 和 9。每行中最大的计数都用方框标出:簇 0 中有 166 个 9,簇 1 中有 176 个 7,簇 2 中有 154 个 1

用最常见的数字为每个簇命名。扫描结果中属于该数字的,都算作命名正确:

ct = pd.crosstab(km.labels_, y)
names = ct.idxmax(axis=1)      # 每行值最大的那一列
right = ct.max(axis=1).sum()
print(names.tolist(), right)

这会输出 [9, 7, 1] 496:在 541 次扫描中,有 496 次扫描被正确命名,这些扫描按组查找,过程中没有使用任何标签。

challenge icon

挑战

中等

为你的 10 个簇命名。起始代码中有 km,它是在没有标签的情况下拟合的;现在你可以使用 y 中的数字。

  1. 将这些簇与 y 交叉统计,并用每个簇中最常见的数字为它命名。
  2. 按名称顺序,打印每个簇中正确命名的扫描数量、簇的大小,以及正确命名扫描所占的比例,百分比取整数。
  3. 打印整体正确命名的扫描数量,百分比保留 1 位小数。

对于 5 个簇:

Cluster named 0: 175 of 177 scans (99%)
Cluster named 2: 160 of 367 scans (44%)
Cluster named 3: 168 of 531 scans (32%)
Cluster named 6: 179 of 359 scans (50%)
Cluster named 7: 176 of 363 scans (48%)
Named right without labels: 858 of 1797 scans (47.7%)

你的哪个簇最弱?其中藏着什么?

亲手试试

import pandas as pd
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans

# 来自 Look at the Digits:1,797 张扫描图,每张有 64 个像素,墨迹值从 0 到 16。
digits = load_digits()
X = digits.data
y = digits.target

# 来自 Shrink with PCA:每张扫描图用 13 个数字保留 80% 的方差。
pca = PCA(n_components=0.8)
X_small = pca.fit_transform(X)

# 来自 Cluster the Digits:不使用标签,找出 10 个簇。
km = KMeans(n_clusters=10, n_init=10, random_state=0).fit(X_small)

# 在下方编写你的代码。
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器