はじめに: 情報を失わずにデータを圧縮する
実際のデータセットには、多くの場合、数百または数千の特徴があります。これらの多くは冗長であるか、 互いに関連しています。そこには 寸法縮小 データを次のように圧縮できます 有用な情報のほとんどを保持しながら、低次元の空間を実現します。アルゴリズム 最もよく使われており、 PCA (主成分分析)、完全に基づいています 共分散行列の固有値と固有ベクトルについて。
何を学ぶか
- 次元の呪いとそれを減らす理由
- 共分散行列: 相関関係を理解する
- PCA: 最大分散の方向を見つける
- 差異の説明とコンポーネント数の選択
- 非線形可視化のための t-SNE と UMAP
- NumPy と scikit-learn での完全な実装
次元の呪い
高次元空間では、データは次のようになります。 散らばっている: すべてのポイントは ほぼ等距離。これにより、距離メトリックがあまり役に立たなくなり、次のような問題が発生します。 モデルの過学習。 PCA は、データを方向に投影することでこの問題に対処します。 より有益です。
共分散行列
La 共分散行列 \\mathbf{C} 彼らを捕まえる 特徴のすべてのペア間の相関関係。中心化されたデータセットの場合 (ゼロ平均) \\mathbf{X} \\in \\mathbb{R}^{n \\times d}:
あらゆる要素 C{ij} 特徴間の共分散 i e j:
対角には各特徴の分散が含まれ、対角以外の要素には共分散が含まれます。 もし C_{ij} > 0、特徴は正の相関があります。 もし C_{ij} = 0、相関はありません。
PCA: 数学的導出
PCA が検索するのは、 方向 これに沿ってデータの分散が最大になります。最初の 主成分 \\mathbf{w}_1 そして単位ベクトルは 投影の分散を最大化します。
ラグランジュ乗数を使用すると、解と固有ベクトル 最大のものに相当する 固有値 di \\mathbf{C}:
どこ \\lambda_1 \\geq \\lambda_2 \\geq \\cdots \\geq \\lambda_d \\geq 0 彼らは 順序付けられた固有値。固有値 \\ラムダ_i そしてまさにそこに によって捕捉された差異 i-番目の主成分。
投影と再構成
に減らすには k 次元を前者に投影します k 固有ベクトル:
おおよその再構成は次のとおりです。
差異の説明
La 説明された分散 最初のものから k コンポーネントと:
実際には、あなたが選択します k 95% または 99% を維持するなど 合計の差異。
import numpy as np
# Dataset sintetico: 200 campioni, 5 feature (correlate)
np.random.seed(42)
n, d = 200, 5
X = np.random.randn(n, 2) @ np.array([[2, 1, 0.5, 0.3, 0.1],
[0.5, 1.5, 1, 0.2, 0.8]])
X += np.random.randn(n, d) * 0.3 # Rumore
# PCA da zero
# 1. Centrare i dati
X_centered = X - X.mean(axis=0)
# 2. Matrice di covarianza
C = np.cov(X_centered, rowvar=False)
print(f"Matrice di covarianza:\n{np.round(C, 3)}\n")
# 3. Autovalori e autovettori
eigenvalues, eigenvectors = np.linalg.eigh(C)
# Ordinare in ordine decrescente
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]
print(f"Autovalori: {np.round(eigenvalues, 4)}")
# 4. Varianza spiegata
var_explained = eigenvalues / eigenvalues.sum()
cumulative = np.cumsum(var_explained)
for i in range(d):
print(f"PC{i+1}: {var_explained[i]*100:.1f}% (cumulativa: {cumulative[i]*100:.1f}%)")
# 5. Proiezione a 2D
k = 2
W_k = eigenvectors[:, :k]
Z = X_centered @ W_k
print(f"\nShape originale: {X.shape} -> Ridotta: {Z.shape}")
# 6. Errore di ricostruzione
X_reconstructed = Z @ W_k.T + X.mean(axis=0)
reconstruction_error = np.mean((X - X_reconstructed)**2)
print(f"Errore di ricostruzione (MSE): {reconstruction_error:.6f}")
Scikit-Learn を使用した PCA
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np
# Standardizzazione (importante! PCA e sensibile alla scala)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCA automatica
pca = PCA(n_components=0.95) # Mantieni 95% varianza
X_pca = pca.fit_transform(X_scaled)
print(f"Componenti selezionate: {pca.n_components_}")
print(f"Varianza spiegata: {pca.explained_variance_ratio_}")
print(f"Shape: {X.shape} -> {X_pca.shape}")
PCA を超えて: t-SNE と UMAP
PCA は以下に限定されます 線形変換。データ内の非線形構造の場合、 t-SNE や UMAP などの手法が使用されます。
t-SNE
t-SNE (t 分布確率的隣接埋め込み) は、 距離 地元の: 元の空間内の近い点は、2D 表現でも近くに残ります。 元の空間と縮小された空間での類似度分布間の KL 発散を最小限に抑えます。
UMAP
UMAP (均一多様体近似と投影)、t-SNE e より高速 保存性が良くなります グローバル構造。それは代数トポロジーに基づいており、 ファジィグラフ理論。
いつどれを使うか: PCA 前処理用 (分類器の前のサイズを削減し、ノイズを除去します)。 t-SNE/UMAP 2D/3D 視覚化 (クラスター、外れ値の調査) 用。 PCA は可逆的で解釈可能ですが、t-SNE/UMAP はそうではありません。
アプリケーション: ML での前処理のための PCA
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import numpy as np
# Dataset digits: 1797 immagini 8x8 = 64 feature
digits = load_digits()
X, y = digits.data, digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Senza PCA (64 feature)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)
clf_full = LogisticRegression(max_iter=5000)
clf_full.fit(X_train_s, y_train)
acc_full = clf_full.score(X_test_s, y_test)
# Con PCA (mantieni 95% varianza)
pca = PCA(n_components=0.95)
X_train_pca = pca.fit_transform(X_train_s)
X_test_pca = pca.transform(X_test_s)
clf_pca = LogisticRegression(max_iter=5000)
clf_pca.fit(X_train_pca, y_train)
acc_pca = clf_pca.score(X_test_pca, y_test)
print(f"Senza PCA: {X_train_s.shape[1]} feature, Accuracy: {acc_full:.4f}")
print(f"Con PCA: {X_train_pca.shape[1]} feature, Accuracy: {acc_pca:.4f}")
print(f"Riduzione: {(1 - X_train_pca.shape[1]/X_train_s.shape[1])*100:.0f}% delle feature")
概要と ML との関係
覚えておくべき重要なポイント
- PCA: 最初のものに投影します k 共分散行列の固有ベクトル
- 固有値 \\ラムダ_i: 各コンポーネントによってキャプチャされた分散
- 差異の説明: あなたが選択します k 分散の 95% 以上を維持するには
- 標準化: PCA 前の基本 (スケールセンシティブ)
- t-SNE/UMAP:ノンリニア2D/3D表示用
- 前処理用の PCA: オーバーフィッティングを軽減し、トレーニングを加速します
次の記事で: を探索してみます 損失関数 で 詳細。 MSE、クロスエントロピー、焦点損失、ヒンジ損失、およびカスタムの選択と作成方法。







