Giảm số chiều của dữ liệu mà vẫn giữ tối đa lượng thông tin quan trọng. Đây là công cụ then chốt để chống lại "lời nguyền số chiều" (curse of dimensionality), trực quan hoá dữ liệu nhiều chiều xuống 2D/3D, nén dữ liệu và tăng tốc độ huấn luyện các mô hình phía sau.
Trực giác thường thấy là "càng nhiều đặc trưng càng tốt", nhưng khi số chiều tăng cao, mô hình lại gặp hàng loạt rắc rối. Đó là lý do giảm chiều trở thành một bước tiền xử lý quan trọng.
PCA là phương pháp không giám sát (không dùng nhãn). Mục tiêu: tìm một hệ trục mới — gọi là các thành phần chính (principal components) — sao cho trục thứ nhất hướng theo phương phương sai lớn nhất của dữ liệu, trục thứ hai hướng theo phương sai lớn nhì và trực giao với trục đầu, và cứ thế. Giữ lại vài trục đầu là giữ được phần lớn "biến thiên" — tức thông tin — của dữ liệu.
Các bước thực hiện:
Tỉ lệ phương sai giải thích (explained variance ratio) cho biết \(k\) thành phần đầu giữ lại bao nhiêu phần trăm thông tin:
$$\text{tỉ lệ giải thích}=\frac{\sum_{i=1}^{k}\lambda_i}{\sum_{j=1}^{n}\lambda_j}$$
Thực tế hay chọn \(k\) nhỏ nhất sao cho tỉ lệ này \(\ge 0.95\) (giữ 95% phương sai). Vì các thành phần là tổ hợp tuyến tính trực giao của đặc trưng gốc, PCA đánh đổi: được số chiều gọn nhưng mất khả năng diễn giải theo đặc trưng ban đầu.
LDA là phương pháp có giám sát (dùng nhãn lớp). Khác với PCA chỉ quan tâm tối đa phương sai tổng thể, LDA đi tìm hướng chiếu sao cho các lớp tách rời nhau tốt nhất sau khi chiếu. Một hướng có phương sai lớn chưa chắc tách lớp tốt — LDA tối ưu trực tiếp khả năng phân biệt lớp.
Cụ thể, LDA tối đa tỉ số Fisher: phương sai giữa các lớp chia cho phương sai trong mỗi lớp:
$$J(w)=\frac{w^\top S_B\,w}{w^\top S_W\,w}$$
trong đó:
Hướng chiếu tối ưu chính là vector riêng ứng với trị riêng lớn nhất của ma trận \(S_W^{-1}S_B\). Lưu ý ràng buộc quan trọng: số chiều đầu ra của LDA tối đa bằng (số lớp \(-\,1\)). Ví dụ bài toán 3 lớp chỉ chiếu được xuống tối đa 2 chiều, bất kể số đặc trưng gốc lớn đến đâu.
| Tiêu chí | PCA | LDA |
|---|---|---|
| Giám sát? | Không giám sát — bỏ qua nhãn | Có giám sát — dùng nhãn lớp |
| Mục tiêu | Tối đa phương sai (giữ tối đa biến thiên dữ liệu) | Tối đa phân tách lớp (tỉ số Fisher \(S_B/S_W\)) |
| Số chiều ra tối đa | Tới \(n\) (số đặc trưng gốc); thường chọn \(k\) theo tỉ lệ phương sai | Tối đa (số lớp \(-\,1\)) |
| Khi nào dùng | Khám phá, nén, khử nhiễu, trực quan hoá khi chưa/không quan tâm nhãn; tiền xử lý chung | Bài toán phân lớp có nhãn, muốn chiếu sao cho dễ phân biệt; cũng dùng như bộ phân lớp |
| Diễn giải | Thành phần là tổ hợp trực giao, khó gắn với đặc trưng gốc | Hướng gắn với khả năng tách lớp |
Một mẹo phổ biến: chạy PCA trước để giảm nhiễu và số chiều, rồi LDA sau để tối ưu phân tách lớp.
# PCA — không giám sát from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # 1) Chuẩn hoá: PCA rất nhạy với thang đo đặc trưng X_std = StandardScaler().fit_transform(X) # 2) Giữ đủ thành phần để đạt 95% phương sai pca = PCA(n_components=0.95) Z = pca.fit_transform(X_std) print(pca.explained_variance_ratio_) # phương sai từng thành phần print(pca.explained_variance_ratio_.sum()) # tổng giữ lại print("Số chiều:", X_std.shape[1], "->", Z.shape[1])
# LDA — có giám sát (cần nhãn y) from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # n_components tối đa = số lớp - 1 lda = LinearDiscriminantAnalysis(n_components=2) Z_lda = lda.fit_transform(X_std, y) # vừa giảm chiều, vừa học phân lớp print(Z_lda.shape) print("Độ chính xác:", lda.score(X_std, y)) # LDA cũng dự đoán được
StandardScaler trước khi fit.