Menu
CoddyTech

将主成分视为模式

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

PCA 分析了什么?每个主成分包含 64 个权重,每个像素对应一个权重,而 components_ 中每一行对应一个主成分:

pca = PCA(n_components=4).fit(X)
print(pca.components_.shape)

这会输出 (4, 64)。将一行重塑为 8 × 8 后,它就变成了一张图片。cmap="gray_r" 表示反转灰度:较大的权重显示为深色,负权重显示为浅色:

ax.imshow(pca.components_[0].reshape(8, 8), cmap="gray_r")

数字的前 4 个成分以 8 × 8 图片显示,权重接近零的地方为灰色,权重较大的地方为深色,负权重的地方为浅色

组件 1 在 4s 和 6s 有墨迹的地方颜色较深,所以它们会落在图的右侧。当扫描中的墨迹落在深色像素上时,得分会更高。

challenge icon

挑战

中等

一位书法老师想看看人们书写同一个数字的不同方式。程序会读取这个数字,起始代码会将它的扫描图像保存在 X 中。

  1. 用 X 拟合包含 3 个成分的 PCA。
  2. 将成分 i 绘制在 axs[i] 上,作为一张 8 × 8 的图片,使用 cmap="gray_r",标题从 Component 1 到 Component 3。
  3. 显示图表。

对于数字 2,程序会绘制出下面的图。接着,Coddy 会描述你的各个面板:

三张 8 × 8 的手写数字 2 的成分图片,标题分别为 Component 1、Component 2 和 Component 3,每张图片都有深色和浅色笔画

亲手试试

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

# 从输入中读取一个数字的每张扫描图像:每行 64 个像素
d = int(input())
digits = load_digits()
X = digits.data[digits.target == d]

# 不要修改下面这行代码
fig, axs = plt.subplots(1, 3)

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

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

无监督学习中的所有课

自己练习: Python 在线编译器