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ピクセル

ここに、使用する数値を増やしながら再構成した3つのスキャンがあります:

2、5、10、20個の数値からそれぞれ再構成した0、3、5と、実際のスキャン。数値が2個の場合、3つとも似たようなぼやけた画像ですが、20個の場合はどれもはっきり読み取れます

平均的な数字の周辺をぼかす数字はわずかで、コンポーネントを追加するたびに細部が復元されます。64個ではなく20個の数字でも、すでにはっきり読み取れます。

challenge icon

チャレンジ

中級

スマートペンは各数字を k 個のPCA数値として無線送信し、プログラムが読み取ります。何が失われるでしょうか?

  1. X に対して k 個の成分でPCAを適合させます。すべてのスキャンを圧縮し、rebuilt に再構築します。
  2. 以下の行を出力します。誤差は X との差の絶対値の平均です。
  3. 最新のスキャン X[-1] を axs[0] に、その再構築画像を axs[1] に、どちらも gray_r で描画します。表示します。

7 の場合:

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

そして、これを描画します。次にCoddyが各パネルについて説明します:

横に並んだ8×8の画像が2枚:ペンが最後に読み取った8と、7個の数値から再構築した、よりぼやけた8

自分で試してみよう

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

# 64ピクセルのスキャンが1,797件あり、ペンによる最新のスキャンは最後の行にある
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オンラインコンパイラ