Menu
CoddyTech

观察 64 个维度

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

本章将用 PCA 处理手写数字。学完后,你就能把一张扫描图压缩成几个数字,再将它还原:

同一个手写的 9 被还原 5 次:用 2 个数字还原出模糊的灰色图像,用 5 个和 10 个数字还原出粗略的 9,用 20 个数字还原出清晰的 9,最后是实际的 64 像素扫描图

首先,看这里。一张扫描图像有 64 个像素,而图表没有 64 个坐标轴,所以 PCA 会把它们压缩到 2 个:

digits = load_digits()
X = digits.data
y = digits.target
points = PCA(n_components=2).fit_transform(X)
for d in range(10):
    ax.scatter(points[y == d, 0], points[y == d, 1], label=str(d))

这里没有缩放器:每个像素都使用一个单位,墨迹值从 0 到 16。

数字扫描结果显示为两个分量上的点,每个数字都标注在中心:0 在底部,4 在最右侧,3 在最左侧,其他数字分布在它们之间的区域,有些彼此重叠

PCA 从未见过 y;它只是给这些点着色。然而,每个数字都聚集在自己的区域里:这种结构原本就在像素中。

challenge icon

挑战

中等

一款儿童手写应用想知道孩子可能会把哪些数字弄混。程序会读取一些数字,这些数字像 358 一样连在一起输入,并存入 chosen。

  1. 用 PCA 将全部 1,797 个扫描结果压缩成每个 2 个数字,并存入 points。
  2. 绘制每个所选数字的扫描结果,并用该数字作为标签。添加图例并显示图表。
  3. 调用 report_closest(points, y, chosen)。

输入 046 时,程序会输出:

Closest on the map: 4 and 6 (13.6 apart)

并绘制下图。然后 Coddy 会描述你的图表:

标题为“看起来相似的数字”的散点图,带有图例:0 位于左侧较低处,6 位于中间较低处,4 位于右侧较高处,6 与 4 的点彼此贴近

亲手试试

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA


# 来自 Measuring Similarity:输出在图上中心位置最接近的两个选定数字
def report_closest(points, y, chosen):
    best = -1
    for i in range(len(chosen)):
        for j in range(i + 1, len(chosen)):
            a = points[y == chosen[i]].mean(axis=0)
            b = points[y == chosen[j]].mean(axis=0)
            dist = np.sqrt(((a - b) ** 2).sum())
            if best == -1 or dist < best:
                best = dist
                pair = (chosen[i], chosen[j])
    print(f"Closest on the map: {pair[0]} and {pair[1]} ({best:.1f} apart)")


# 1,797 张扫描图:每张在 X 中有 64 个像素,绘制的数字保存在 y 中
digits = load_digits()
X = digits.data
y = digits.target

# 要比较的数字,像 358 一样连在一起输入
chosen = []
for ch in input():
    chosen.append(int(ch))

# 不要修改下面的代码
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

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

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

无监督学习中的所有课

自己练习: Python 在线编译器