Giảm chiều dữ liệu PCA thuần NumPy bằng phân rã giá trị suy biến SVD
Viết hàm pca_transform(X: np.ndarray, n_components: int) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: matrix multiplication, svd.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu nguyên lý phân tích thành phần chính (Principal Component Analysis - PCA).
- Sử dụng phân rã giá trị suy biến SVD (X = U Sigma VT) thay vì tính trực tiếp ma trận hiệp phương sai XT X để tăng độ ổn định số học.
- Chuẩn hóa dấu của vector thành phần chính theo quy ước chuẩn và tính tỷ lệ phương sai giải thích được (explained variance ratio).
Mô tả bài toán
Viết hàm pca_transform(X: np.ndarray, n_components: int) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
X: Ma trận dữ liệu kích thước (N, D) gồm N mẫu và D đặc trưng.- Kiểm tra tính hợp lệ:
- Nếu n_components ≤ 0 hoặc n_components > D hoặc N < n_components, raise
ValueError("n_components khong hop le"). - Trừ trung bình theo từng cột (Mean Centering):
Xcentered = X - μ, trong đó μ = 1N ∑i=1N Xi.
- Phân rã SVD trên Xcentered:
U, S, Vt = np.linalg.svd(Xcentered, fullmatrices=False).
- Vector thành phần chính (components):
- Lấy K = n_components hàng đầu tiên của Vt:
components = Vt[:n_components]. - Quy ước dấu chuẩn (Deterministic Sign Convention): Với mỗi hàng k trong
components, tìm phần tử có giá trị tuyệt đối lớn nhất. Nếu phần tử đó âm, nhân hàng đó và cột chiếu tương ứng với -1. - Chiếu dữ liệu:
- Xproj = Xcentered · componentsT có kích thước (N, n_components).
- Tỷ lệ phương sai giải thích được (explained variance ratio):
- Phương sai của từng thành phần: var = S2N - 1 (hoặc S2 / ∑ S2).
explained_variance_ratio = (S[:n_components] ** 2) / np.sum(S ** 2).
Trả về tuple (X_proj, components, explained_variance_ratio).
Input
- Tham số:
X: np.ndarray,n_components: int.
Output
- Trả về:
tuple[np.ndarray, np.ndarray, np.ndarray].
Ràng buộc
- Thời gian chạy tối đa: 1000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào tuân thủ đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
pca_transform(X=[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], n_components=1)Output
[3, 1]Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
pca_transform(X=[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0]], n_components=2)Output
[4, 2]Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
