CH 10Phase 1 · Linear Algebra for AI

Principal Component Analysis (PCA)

১৫–২৫ মিনিট বাংলা · Math · Python
📖 একটি ছোট গল্প

একজন ডাক্তার রোগীর ১০০টি test report দেখে সিদ্ধান্ত নেন — কিন্তু আসলে ৩-৪টি প্রধান "অক্ষ"-এ সমস্ত তথ্য সংকুচিত হয়ে যায় (হৃদরোগ, রক্তচাপ, সংক্রমণ, বিপাক)। বাকিগুলো কেবল noise বা সাময়িক variation।

PCA ঠিক এই কাজটাই করে — data-র "প্রকৃত" কয়েকটি অক্ষ খুঁজে বের করে, বাকিগুলো ফেলে দেয়। MNIST থেকে gene expression — সর্বত্র এটি প্রথম analysis tool।

PCA কী করে?

High-dimensional data X ∈ ℝn×d-কে এমন একটি নতুন orthogonal axis-set-এ project করে যেখানে প্রথম axis সবচেয়ে বেশি variance ধরে, দ্বিতীয় তার পরের সর্বোচ্চ, এবং এভাবে চলতে থাকে।

  • Goal: dimensionality reduction, noise removal, visualization।
  • Output: k principal component (PC₁, PC₂, …, PCk)।

Algorithm — ৫ ধাপ

  1. Center: প্রতিটি feature থেকে mean বিয়োগ → X̃ = X − μ
  2. Covariance matrix: C = (1/n) X̃T (shape d×d)।
  3. Eigendecomposition: C = V Λ VT। (অথবা সরাসরি X̃-এ SVD।)
  4. Top-k components: সবচেয়ে বড় k eigenvalue-র eigenvector নিন → Vk
  5. Project: Z = X̃ Vk। Shape (n, k)।

Explained Variance

প্রতিটি principal component কতটুকু variance ব্যাখ্যা করে:

explained_ratioi = λi / Σj λj
✨ টিপ
সাধারণত plot করি cumulative explained variance ব্যবহার করে — কত PC রাখলে 95% variance ধরে রাখা যায়, সেটাই k-এর ভালো পছন্দ।

SVD দিয়ে PCA

Covariance matrix বানানোর দরকার নেই — সরাসরি centered data-তে SVD:

X̃ = U Σ VT ⇒ PCA components = V-এর columns
Z = X̃ Vk = Uk Σk

এটি বেশি stable ও দ্রুত — sklearn ভেতরে এভাবেই করে।

Python Implementation (scratch + sklearn)

pythonPython · NumPy
import numpy as np

# Fake 3-D dataset: 200 samples, mostly along one direction
np.random.seed(0)
n = 200
t = np.linspace(0, 1, n)
X = np.stack([t, 2*t, 3*t], axis=1) + 0.1 * np.random.randn(n, 3)

# --- Scratch PCA ---
mu = X.mean(axis=0)
Xc = X - mu

# Method A: covariance + eigendecomposition
C = (Xc.T @ Xc) / n
eigvals, eigvecs = np.linalg.eigh(C)             # ascending order
idx = np.argsort(-eigvals)                       # sort descending
eigvals, eigvecs = eigvals[idx], eigvecs[:, idx]

print("variance ratio:", eigvals / eigvals.sum())

# Method B: SVD on centered data (preferred)
U, S, Vt = np.linalg.svd(Xc, full_matrices=False)
explained = (S**2) / (S**2).sum()
print("svd explained ratio:", explained)

# Project to 2-D
k = 2
Vk = Vt[:k].T                                    # (3, 2)
Z = Xc @ Vk
print("reduced shape:", Z.shape)                 # (200, 2)

# --- sklearn version ---
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
Z_sk = pca.fit_transform(X)
print("sklearn explained ratio:", pca.explained_variance_ratio_)

# Reconstruction (lossy)
X_reconstructed = Z @ Vk.T + mu
err = np.linalg.norm(X - X_reconstructed) / np.linalg.norm(X)
print(f"reconstruction relative error: {err:.4f}")

AI/ML সংযোগ

  • Visualization: 100-D embedding → 2-D scatter plot।
  • Noise reduction: ছোট eigenvalue-র direction = noise; ফেলে দিন।
  • Feature compression: 1000 feature → 50 PC, training দ্রুত।
  • Preprocessing: PCA-whitening দিয়ে covariance = I বানানো।
  • Eigenfaces: face image-এ PCA → recognition-এর ধ্রুপদী পদ্ধতি।
  • Bottleneck intuition: autoencoder = non-linear PCA।

সীমাবদ্ধতা

  • Linear — curved manifold (যেমন swiss roll) ধরতে পারে না; সেক্ষেত্রে t-SNE/UMAP/autoencoder।
  • Feature scale-এর প্রতি sensitive — সাধারণত আগে StandardScaler ব্যবহার করুন।
  • Interpretability সীমিত — PC = original feature-এর mixture।

Common Mistakes

  • Center না করে PCA — সম্পূর্ণ ভুল component আসবে।
  • Scale না করা — বড় unit-এর feature dominate করবে।
  • k বাছাই করার আগে explained variance curve না দেখা।
  • Test set-এ আবার fit করা — train-এর PCA দিয়ে শুধু transform করতে হবে।

Practice Tasks

  1. Iris dataset-এ PCA চালিয়ে 4-D → 2-D plot করুন; class রং দিয়ে আলাদা করুন।
  2. Explained variance ratio-র cumulative sum plot করুন; ৯৫% রাখতে কত k লাগে?
  3. Scaling করা ও না-করা দুই অবস্থায় PC compare করুন।

Assignment

MNIST থেকে ১০০০ digit image নিন (sklearn-এ load_digits)। 64-D feature-এ PCA চালিয়ে 2-D scatter plot করুন digit-অনুসারে রঙ দিয়ে। তারপর k=5, 10, 20, 40 অবস্থায় reconstruction দেখান — কোন k-এ চোখে চেনা যায়?

Interview Questions

  1. PCA কী করে এবং কেন প্রথম PC সর্বাধিক variance ধরে?
  2. SVD ও PCA-র সম্পর্ক কী?
  3. PCA-র আগে standardization কেন জরুরি?
  4. PCA-র সীমাবদ্ধতা কী, কখন t-SNE/UMAP ব্যবহার করবেন?

Mini Project

"Eigenfaces Lite" — sklearn-এর fetch_olivetti_faces দিয়ে ছোট face dataset লোড করুন। PCA চালিয়ে প্রথম 16 component-কে image হিসেবে plot করুন (এগুলোই "eigenfaces")। তারপর একটি face-কে top-k component দিয়ে reconstruct করে দেখান k=10, 50, 100-এ মান কেমন বদলায়।

Summary · সারসংক্ষেপ

  • PCA = data-র সর্বোচ্চ variance ধরে এমন orthogonal axis খোঁজা।
  • Algorithm: center → covariance → eigendecomposition → top-k → project। (অথবা সরাসরি SVD।)
  • Visualization, noise reduction, feature compression, whitening — সব এর প্রয়োগ।
  • Linear সীমাবদ্ধতা — curved manifold-এর জন্য non-linear method।
✨ Phase 1 শেষ — Linear Algebra Mastery
Linear Algebra-র ভিত্তি সম্পূর্ণ। পরবর্তী phase-এ Calculus শুরু — limit, derivative, gradient, এবং সবশেষে backpropagation, যা ML training-এর হৃদয়।