Chương 2·Bài 2.9

Dimensionality reduction

Dữ liệu nhiều cột thường có những cột thay đổi cùng nhau. Ví dụ điểm toán và điểm lý của một lớp hay tăng giảm cùng nhau: vẽ lên mặt phẳng thì các điểm nằm gần một đường thẳng, nên thay hai số bằng một số (vị trí trên đường đó) chỉ mất ít thông tin. Giảm chiều (dimensionality reduction) làm việc này với dữ liệu nhiều chiều.

Bài này học PCA, cách vẽ dữ liệu nhiều chiều bằng t-SNE, UMAP, và trường hợp phần bị bỏ đi lại chứa đúng thông tin cần để dự đoán.

PCA: hướng có phương sai lớn nhất

Phân tích thành phần chính (Principal Component Analysis) tìm các hướng mà dữ liệu trải ra nhiều nhất. Ý tưởng: hướng nào dữ liệu ít thay đổi thì chiếu bỏ đi cũng ít mất thông tin.

Trước hết trừ trung bình để dữ liệu có tâm ở gốc tọa độ. Với ma trận dữ liệu đã trừ trung bình X∈Rn×dX \in \R^{n\times d}, ma trận hiệp phương sai (covariance) là

Σ=1nX⊤X.\Sigma = \frac{1}{n}X^\top X.

Ô (j,j)(j, j) trên đường chéo là phương sai của cột jj, vì hiệp phương sai của một biến với chính nó là phương sai; ô (j,l)(j, l) đo hai cột cùng tăng giảm với nhau mạnh đến đâu.

Chiếu mỗi điểm lên hướng đơn vị u\mathbf{u} cho các số XuX\mathbf{u}, có phương sai u⊤Σ u\mathbf{u}^\top\Sigma\,\mathbf{u}. Ta cần

max⁡u u⊤Σ uthỏa∥u∥=1.\max_{\mathbf{u}}\ \mathbf{u}^\top\Sigma\,\mathbf{u} \quad\text{thỏa}\quad \lVert\mathbf{u}\rVert = 1.

Lời giải là hướng thỏa Σu=λu\Sigma\mathbf{u} = \lambda\mathbf{u}: u\mathbf{u} là vector riêng (eigenvector) của Σ\Sigma, và phương sai thu được chính là trị riêng λ\lambda. Thành phần chính thứ nhất là vector riêng ứng với trị riêng lớn nhất; thành phần thứ hai là vector riêng kế tiếp, tự động vuông góc với thành phần thứ nhất; và cứ thế.

PC1 theo hướng trải dài nhất, PC2 vuông góc với nó.PC1 · λ = 3.29PC2 · λ = 0.23
PC1 theo hướng trải dài nhất, PC2 vuông góc với nó.

Giữ kk thành phần đầu, tỉ lệ phương sai giữ lại (explained variance ratio) là

λ1+⋯+λkλ1+⋯+λd.\frac{\lambda_1 + \dots + \lambda_k}{\lambda_1 + \dots + \lambda_d}.

Ba thành phần đầu giữ 60%, 25%, 10% thì giữ hai thành phần là giữ 85%. Cách chọn kk thường gặp: giữ đủ để đạt khoảng 95% phương sai, hoặc chọn kk bằng cross-validation nếu PCA là bước tiền xử lý cho một mô hình khác.

Tính thử trên bốn điểm đã có trung bình bằng 0: (−2,−1)(-2, -1), (−1,−1)(-1, -1), (1,1)(1, 1), (2,1)(2, 1). Ma trận hiệp phương sai là

Σ=14(106 64)=(2.51.5 1.51).\Sigma = \frac14\begin{pmatrix} 10 & 6 \ 6 & 4\end{pmatrix} = \begin{pmatrix} 2.5 & 1.5 \ 1.5 & 1\end{pmatrix}.

Phương trình đặc trưng λ2−3.5λ+0.25=0\lambda^2 - 3.5\lambda + 0.25 = 0 cho λ1≈3.427\lambda_1 \approx 3.427, λ2≈0.073\lambda_2 \approx 0.073. Thành phần thứ nhất giữ 3.427/3.5≈97.9%3.427/3.5 \approx 97.9\% phương sai: bốn điểm gần như nằm trên một đường thẳng. Vector riêng tương ứng có thể chọn u1≈(0.851, 0.526)\mathbf{u}_1 \approx (0.851,\ 0.526); hướng ngược lại cũng biểu diễn cùng một trục.

Chiếu xuống PC1 rồi tái tạo, mỗi điểm chỉ lệch một đoạn ngắn.u₁ ≈ (0.851, 0.526)λ₁ ≈ 3.427 · λ₂ ≈ 0.073PC1 giữ 97.9%vòng rỗng: điểm tái tạo
Chiếu xuống PC1 rồi tái tạo, mỗi điểm chỉ lệch một đoạn ngắn.

Có một cách nhìn tương đương: trong các phép chiếu tuyến tính trực giao xuống kk chiều, PCA là phép chiếu làm tổng bình phương khoảng cách tái tạo nhỏ nhất. Giữ nhiều phương sai nhất và mất ít thông tin nhất là cùng một bài toán.

Tái tạo từ 2, 10, 29 thành phần chính.k = 2k = 5k = 10k = 29gốc
Tái tạo từ 2, 10, 29 thành phần chính.

Hỏi nhanh

Dữ liệu hai chiều đã trừ trung bình có ma trận hiệp phương sai Σ\Sigma với hai trị riêng 4 và 1. Chiếu lên PC1 thì giữ được bao nhiêu phần phương sai, và tọa độ trên PC1 có độ lệch chuẩn bao nhiêu?

Tính bằng SVD

Có thể tránh lập Σ\Sigma bằng phân tích giá trị kỳ dị (singular value decomposition) của chính XX:

X=USV⊤.X = U S V^\top.

Các cột của VV là các thành phần chính, tọa độ mới của dữ liệu là XV=USXV = US, và trị riêng λi=si2/n\lambda_i = s_i^2/n. Phương sai theo mỗi thành phần tỉ lệ với si2s_i^2, không phải sis_i: giá trị kỳ dị 6 và 2 cho thành phần đầu 36/40=90%36/40 = 90\%.

Hỏi nhanh

SVD của dữ liệu đã trừ trung bình cho các giá trị kỳ dị s=(6,3,1)s = (6, 3, 1). Giữ hai thành phần đầu thì giữ được bao nhiêu phần phương sai?

PCA trên 256 hàng của ảnh tháp (tính bằng SVD): ảnh gốc và ảnh dựng lại từ k thành phần đầu.

Lưu ý khi dùng PCA

  • Chuẩn hóa nếu đơn vị khác nhau. Không chuẩn hóa thì một cột đo bằng đồng sẽ “nuốt” toàn bộ phương sai và thành phần chính chỉ là cột đó. Dời cả bảng đi một hằng số không đổi gì, vì PCA trừ trung bình trước; nhưng nhân riêng một cột với hằng số là đổi phương sai của cột đó và đổi các thành phần chính.
  • PCA không biết nhãn. Hướng phương sai nhỏ có thể lại là hướng phân biệt các lớp (hình dưới). Giảm chiều quá tay trước khi phân loại có thể làm mất đúng thông tin cần thiết.
  • Fit PCA trên train, rồi biến đổi validation và test bằng cùng phép chiếu, như mọi bước tiền xử lý khác (bài 1.4).
  • Với dữ liệu thưa như TF-IDF, dùng TruncatedSVD thay cho PCA để không phải trừ trung bình làm mất tính thưa. Kỹ thuật này có tên là latent semantic analysis.
Hướng phương sai lớn PC1 trộn hai lớp; PC2 mới tách được.PC1hai lớp chỉ khác nhau theo chiều dọctọa độ PC1tọa độ PC2
Hướng phương sai lớn PC1 trộn hai lớp; PC2 mới tách được.

Hỏi nhanh

Hai lớp chỉ khác nhau ở một cột có biến thiên rất nhỏ. Cột còn lại là nhiễu, biên độ lớn. PCA không dùng nhãn sẽ ưu tiên giữ hướng nào?

Hỏi nhanh

Có hai cột: thu nhập tính bằng đồng, độ lệch chuẩn cỡ 10710^7, và tuổi, độ lệch chuẩn cỡ 10. Chạy PCA mà không chuẩn hóa. PC1 gần như là hướng nào?

t-SNE và UMAP: để nhìn, không phải để đo

PCA là phép chiếu tuyến tính, nên không “duỗi” được dữ liệu nằm trên mặt cong. t-SNE và UMAP là các phương pháp phi tuyến, cố giữ láng giềng gần của mỗi điểm khi đưa xuống 2 chiều. Chúng cho những hình rất đẹp: các cụm tách bạch rõ ràng. Nhưng đọc hình phải cẩn thận:

  • Kích thước cụm và khoảng cách giữa các cụm trên hình gần như không mang ý nghĩa.
  • Kết quả phụ thuộc tham số (perplexity của t-SNE, n_neighbors của UMAP) và seed ngẫu nhiên. Chạy vài cấu hình trước khi kết luận.
  • Triển khai t-SNE trong scikit-learn không có transform cho điểm mới, nên không dùng làm đặc trưng cho train/test. UMAP thì có transform, nhưng vẫn nên ưu tiên PCA khi cần đặc trưng ổn định.

Hỏi nhanh

Trên hình t-SNE, cụm A nằm rất xa cụm B, còn A thì sát C. Ta được phép kết luận gì?

PCA t-SNE UMAP
Loại Tuyến tính Phi tuyến Phi tuyến
Giữ Cấu trúc toàn cục, phương sai Láng giềng gần Láng giềng gần, phần nào cấu trúc toàn cục
Áp lên điểm mới Có Không Có
Dùng chủ yếu để Tiền xử lý, nén, khử nhiễu Trực quan hóa Trực quan hóa, đôi khi làm đặc trưng
PCA để các chữ số chồng lên nhau; t-SNE tách thành cụm.0123456789PCA 2 chiều0123456789t-SNE
PCA để các chữ số chồng lên nhau; t-SNE tách thành cụm.

Tự cài PCA bằng NumPy

Với X có nn hàng, dd cột, các bước kèm shape:

  1. Trừ trung bình từng cột (vector shape (d,)) để dữ liệu có tâm ở 0, được X_centered.
  2. SVD của X_centered với full_matrices=False cho U, s, Vt. Hàng đầu của Vt là PC1, shape (d,).
  3. Giữ kk hướng: Vt[:k].T có shape (d, k). Nhân X_centered với nó, mỗi mẫu còn kk tọa độ.
  4. Tái tạo: nhân tọa độ với ma trận chuyển vị, rồi cộng lại trung bình.

Code dưới chạy trên bốn điểm ở mục PCA và đối chiếu với scikit-learn.

Python
import numpy as np
from sklearn.decomposition import PCA

X_pca = np.array([[-2., -1.], [-1., -1.], [1., 1.], [2., 1.]])
center = X_pca.mean(axis=0)
X_centered = X_pca - center
U, s, Vt = np.linalg.svd(X_centered, full_matrices=False)
components = Vt[:1].T
coordinates = X_centered @ components
reconstructed = coordinates @ components.T + center
ratio = s[0] ** 2 / np.sum(s ** 2)
library = PCA(n_components=1).fit(X_pca)
print("shape:", components.shape, coordinates.shape, reconstructed.shape)
print("tỉ lệ:", round(float(ratio), 4))
print("MSE tái tạo:", round(float(np.mean((reconstructed - X_pca) ** 2)), 6))
print("khớp tái tạo:", np.allclose(reconstructed, library.inverse_transform(library.transform(X_pca))))

Hai điểm hay bị tưởng là lỗi:

  • Dấu ngược. SVD có thể cho −u-\mathbf u thay vì u\mathbf u. Hai vector mô tả cùng một đường: tọa độ đổi dấu nhưng dữ liệu tái tạo không đổi. Vì vậy so hai cách cài PCA bằng dữ liệu tái tạo, không so từng hệ số.
  • Mẫu số n−1n - 1. scikit-learn tính phương sai với mẫu số n−1n-1, bài này dùng nn. Tỉ lệ giữ lại không đổi vì mọi trị riêng cùng nhân một hệ số.

Dùng thư viện

Python
import numpy as np
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

X, y = load_digits(return_X_y=True)          # 1797 ảnh 8×8 = 64 chiều
for name, data in [("thô", X), ("chuẩn hóa", StandardScaler().fit_transform(X))]:
    pca = PCA().fit(data)
    k = np.searchsorted(np.cumsum(pca.explained_variance_ratio_), 0.95) + 1
    print(f"{name}: cần {k} trên 64 thành phần để giữ 95% phương sai")

Chuẩn hóa làm cần nhiều thành phần hơn. Các pixel ở viền ảnh gần như luôn trắng, phương sai rất nhỏ; chuẩn hóa chia chúng cho độ lệch chuẩn bé xíu nên chúng thành những chiều có phương sai 1, ngang các pixel giữa ảnh chứa nét chữ. Ở ảnh, các pixel đã cùng đơn vị, nên chuẩn hóa không bắt buộc và cần kiểm bằng validation.

Ví dụ này cũng cho thấy “giữ 95% phương sai” là 95% tổng phương sai theo thang đo đang dùng: đổi thang thì con số đổi. Nó không phải 95% thông tin về nhãn, và không bảo đảm accuracy còn 95%.

Giữ 95% phương sai: 29 thành phần trên dữ liệu thô, 40 sau khi chuẩn hóa.00.50.95116324864số thành phần giữ lại29thô40chuẩn hóaphương sai giữ lại (tích lũy)
Giữ 95% phương sai: 29 thành phần trên dữ liệu thô, 40 sau khi chuẩn hóa.

Hỏi nhanh

Với bộ digits, dữ liệu thô cần 29 thành phần để giữ 95% phương sai, còn dữ liệu đã chuẩn hóa cần tới 40. Vì sao chuẩn hóa lại cần nhiều hơn?

Khi đi thi

  • Fit scaler và PCA trên train của từng fold, rồi transform phần còn lại.
  • Embedding hàng nghìn chiều thì thử PCA xuống vài trăm chiều; chỉ giữ nếu validation không tụt.
  • Dùng t-SNE, UMAP để nhìn, không đưa tọa độ của chúng làm feature.

Tóm tắt

  • PCA chiếu dữ liệu lên các hướng có phương sai lớn nhất, chính là các vector riêng của ma trận hiệp phương sai; tính bằng SVD.
  • Tỉ lệ phương sai giữ lại giúp chọn số chiều; chuẩn hóa trước khi đơn vị khác nhau; fit trên train.
  • PCA không dùng nhãn, nên có thể bỏ mất hướng phân biệt lớp.
  • t-SNE, UMAP dùng để nhìn cấu trúc láng giềng; không đọc khoảng cách giữa cụm, không dùng t-SNE làm đặc trưng.

Kiểm tra cuối bài

Mười câu kiểm cả cách hiểu, phép tính và quy trình. Câu sai chỉ ra phần cần đọc lại; hãy làm trước khi mở lời giải.

Câu 1

PCA fit trên X_train có shape (120, 7) và giữ 3 thành phần. Transform X_valid có shape (40, 7) thì đầu ra có shape gì?

Câu 2

Tự cài PCA bằng SVD. Với X có shape (n, d), dòng nào trừ trung bình đúng cho từng feature?

Câu 3

PCA có ba trị riêng là 6, 3 và 1. Giữ hai thành phần đầu thì giữ được bao nhiêu phần phương sai?

Câu 4

Với v=(1,−2,3)v = (1, -2, 3), vector đơn vị cùng hướng với vv là gì?

Đề thiUSA-NA-AIO 2026 · Vòng 1 · Part 2.1

Câu 5

Trên cùng các fold, hai cấu hình PCA giữ 95% và 99% phương sai có accuracy validation lần lượt là 0.88 và 0.84. Ta chọn theo accuracy. Kết luận nào đúng?

Câu 6

Code fit PCA trên toàn bộ X_dev, rồi mới chạy cross_val_score cho classifier. Sửa thế nào để PCA không học thống kê từ fold validation?

Câu 7

Ma trận hiệp phương sai chia cho nn hay n−1n - 1 thì tỉ lệ phương sai giữ lại có đổi không?

Câu 8

Mặc định, TruncatedSVD trên ma trận TF-IDF có trừ trung bình như PCA không?

Câu 9

UMAP vẽ một bản đồ 2 chiều cho các embedding. Khi đọc khoảng cách trên hình, câu nào đúng với điều UMAP ưu tiên?

Đề thiUSA-NA-AIO 2026 · Vòng 1 · Part 1.5

Câu 10

PCA tự cài cho một thành phần đúng bằng âm của thành phần mà thư viện cho, còn trị riêng và trung bình thì khớp. Đối chiếu thế nào để kiểm đúng phép chiếu, thay vì chỉ so hướng?

Đọc thêm

  • James, Witten, Hastie, Tibshirani - An Introduction to Statistical Learning, chương 12. PCA từ góc nhìn thống kê, kèm cách đọc explained variance.
  • Géron - Hands-On Machine Learning, chương 8. PCA, randomized PCA và các phương pháp giảm chiều khác trong scikit-learn.
  • van der Maaten, Hinton (2008) - Visualizing Data using t-SNE; McInnes và cộng sự (2018) - UMAP. Bài gốc của hai phương pháp trực quan hóa.

  • scikit-learn - PCA. Centering, SVD, explained variance và quan hệ với sparse data.

  • Distill - How to Use t-SNE Effectively. Các thí nghiệm trực quan giúp tránh đọc quá mức hình t-SNE.