Menu
CoddyTech

压缩与重建

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

扫描的成分得分就像一个配方:从平均扫描图像开始,然后将每种模式乘以对应的得分,再把结果加起来。inverse_transform会按这个配方还原出 64 个像素:

pca = PCA(n_components=10).fit(X)
codes = pca.transform(X)                # 每次扫描得到 10 个数字
rebuilt = pca.inverse_transform(codes)  # 重新得到 64 个像素

下面是用越来越多的数字重建的三次扫描:

0、3 和 5 分别用 2、5、10 和 20 个数字重建,然后是真实扫描结果。用 2 个数字重建时,三者都是相似的模糊图像;用 20 个数字重建时,每个数字都清晰可辨

少量数字会让平均数字附近变得模糊;每增加一个成分,就能还原更多细节。用 20 个数字而不是 64 个数字,已经能清晰辨认了。

challenge icon

挑战

中等

智能笔会将每个数字作为 k 个 PCA 数字无线传输,由程序读取。哪些信息丢失了?

  1. 在 X 上用 k 个成分拟合 PCA。压缩所有扫描结果,然后将它们重建到 rebuilt 中。
  2. 打印下面的内容;误差是与 X 的平均绝对差。
  3. 在 axs[0] 上绘制最新扫描结果 X[-1],并在 axs[1] 上绘制其重建结果,两者都使用 gray_r。显示图像。

对于 7:

Sent: 7 numbers per scan instead of 64
Average pixel error: 1.739

并绘制出以下图像。随后,Coddy 会描述你的图像面板:

两张并排的 8×8 图片:钢笔最新扫描出的数字 8,以及用 7 个数字重建出的图像,一个更模糊的 8

亲手试试

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

# 共有 1,797 次扫描,每次扫描包含 64 个像素;笔的最新扫描结果位于最后一行
digits = load_digits()
X = digits.data
k = int(input())

# 不要修改下面的代码行
fig, axs = plt.subplots(1, 2)
axs[0].set_title("Scan")
axs[1].set_title(f"Rebuilt from {k} numbers")

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

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

无监督学习中的所有课

自己练习: Python 在线编译器