Nhóm 8

Giảm chiều — PCA & LDA

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.

Vì sao cần giảm chiều
Khi nhiều đặc trưng lại là một vấn đề

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.

Ý tưởng cốt lõi: dữ liệu thực tế thường nằm gần một "không gian con" có số chiều thấp hơn nhiều so với số đặc trưng gốc. Giảm chiều đi tìm chính không gian con đó.
Principal Component Analysis (PCA)
Học không giám sát — tối đa phương sai

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.

Linear Discriminant Analysis (LDA)
Học có giám sát — tối ưu phân tách lớp

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.

Trực giác: PCA hỏi "dữ liệu trải rộng theo hướng nào?", còn LDA hỏi "hướng nào giúp tôi phân biệt các lớp dễ nhất?". Vì vậy LDA vừa giảm chiều vừa là một bộ phân lớp tuyến tính.
PCA và LDA: chọn cái nào?
So sánh nhanh hai phương pháp tuyến tính
Tiêu chíPCALDA
Giám sát?Không giám sát — bỏ qua nhãnCó giám sát — dùng nhãn lớp
Mục tiêuTố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 đaTới \(n\) (số đặc trưng gốc); thường chọn \(k\) theo tỉ lệ phương saiTối đa (số lớp \(-\,1\))
Khi nào dùngKhá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ý chungBà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ảiThành phần là tổ hợp trực giao, khó gắn với đặc trưng gốcHướ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.

Thực hành với scikit-learn
PCA & LinearDiscriminantAnalysis
# 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
Luôn chuẩn hoá trước PCA: PCA tối đa phương sai nên rất nhạy với thang đo. Một đặc trưng đo bằng đơn vị lớn (ví dụ "thu nhập" hàng triệu) sẽ áp đảo các đặc trưng nhỏ và "chiếm" hết thành phần chính. Hãy StandardScaler trước khi fit.
← Nhóm trước
Nhóm 7: Mạng nơ-ron