python-089Đọc toàn bộ đề miễn phí

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]:

PythonNâng cao35 phút

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ủ đề

pcasvdlinear algebranumpy

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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.