Menu
CoddyTech

PCAで次元を縮小しよう

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 44/51。

64ピクセルは、数字に必要な数を上回っています。PCAでは、コンポーネント数ではなく、分散の割合を目標にできます:

最初のn個のコンポーネントで保持される数字の分散の割合を示す右肩上がりの曲線。最初は急で、その後平坦になる。90%の破線は21個のコンポーネントの位置で曲線と交わる

n_components=0.9 は、90%を保持する最小限の成分数を保ちます:

pca = PCA(n_components=0.9)
X_small = pca.fit_transform(X)
print(pca.n_components_, X_small.shape)

これは 21 (1797, 21) と出力します。数値の3分の1で、画像の大部分です。

ここではスケーラーを使いません。すべてのピクセルが、インクの濃さを表す0から16までの同じ単位を共有します。スケーリングすると、ほとんど何もない端のピクセルが拡大され、完全な特徴量になってしまいます。

challenge icon

チャレンジ

中級

スキャンデータを縮小しましょう。プログラムは、0.8のように、保持する分散の割合を読み取ります。

  1. 生のピクセルデータでその割合を保つためにPCAが必要とする成分数を出力し、次にスケーリング済みピクセルデータの場合も出力します。
  2. 必要な成分数が少ない方を選び、その名前と縮小後のデータの形状を出力します。

0.6の場合:

Raw pixels: 7 components
Scaled pixels: 11 components
Keep: raw pixels, shape (1797, 7)

ここから先は、プロジェクトでは分散の80%を保持します。

自分で試してみよう

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# Look at the Digits より:64 ピクセルのスキャン画像 1,797 枚、インクの濃さは 0 から 16
digits = load_digits()
X = digits.data
y = digits.target

# 保持する分散の割合(例:0.8)
share = float(input())

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ