Menu
CoddyTech

对数字进行聚类

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

现在开始探索。让 k-means 把这组由 13 个数字组成的扫描数据分成 10 组,每组对应一个你希望它找出的数字。它看不到任何标签:

km = KMeans(n_clusters=10, n_init=10, random_state=0).fit(X_small)

中心位于 k-means 运行的空间,也就是 PCA 空间中:它由 13 个数字组成,不是一张图片。pca.inverse_transform 会重建它的 64 个像素:

左侧是一个 k-means 中心的 13 个数字的柱状图,前两个柱子很高,后面的柱子都很矮。右侧是重建后的同一个中心,看起来像数字 0 的模糊 8×8 图片

value_counts() 会按从大到小列出各个簇,因此中心点画廊看起来就像是在对扫描图像进行人口普查。

challenge icon

挑战

中等

初始内容包含这些扫描图和 X_small,也就是它们用 13 个数表示的版本。

  1. 用 k-means 在 X_small 中找到 10 个簇。
  2. 重建每个中心的 64 个像素。
  3. 绘制一个 2 行 5 列的画廊,按簇大小从大到小排列:每个中心显示为一张 8 × 8 的 gray_r 图片,并用簇大小作为标题,例如 120 scans。整理布局并显示。

如果有 5 个簇,结果会像这样:

一排五个模糊的数字中心,标题分别为 531、367、363、359 和 177 张扫描图

你的结果有 10 个簇。Coddy 会描述每张图表。k-means 自动找出了哪些数字?

亲手试试

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans

# 来自“观察数字”:1,797 张扫描图,每张有 64 个像素,墨迹值从 0 到 16
digits = load_digits()
X = digits.data
y = digits.target

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

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

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

无监督学习中的所有课

自己练习: Python 在线编译器