观察 64 个维度
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 29 课,共 51 课。
本章将用 PCA 处理手写数字。学完后,你就能把一张扫描图压缩成几个数字,再将它还原:
首先,看这里。一张扫描图像有 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。
PCA 从未见过 y;它只是给这些点着色。然而,每个数字都聚集在自己的区域里:这种结构原本就在像素中。
挑战
中等一款儿童手写应用想知道孩子可能会把哪些数字弄混。程序会读取一些数字,这些数字像 358 一样连在一起输入,并存入 chosen。
- 用 PCA 将全部 1,797 个扫描结果压缩成每个 2 个数字,并存入
points。 - 绘制每个所选数字的扫描结果,并用该数字作为标签。添加图例并显示图表。
- 调用
report_closest(points, y, chosen)。
输入 046 时,程序会输出:
Closest on the map: 4 and 6 (13.6 apart)并绘制下图。然后 Coddy 会描述你的图表:
亲手试试
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")
# 在下面编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器