Tôi hiểu mối quan hệ giữa Phân tích thành phần chính và Phân tách giá trị số đơn ở cấp độ đại số / chính xác. Câu hỏi của tôi là về việc thực hiện scikit-learn .
Tài liệu nói: " [TruncatedSVD] rất giống với PCA, nhưng hoạt động trực tiếp trên các vectơ mẫu, thay vì trên ma trận hiệp phương sai. ", Điều này sẽ phản ánh sự khác biệt đại số giữa cả hai phương pháp. Tuy nhiên, sau đó nó nói: " Công cụ ước tính này [TruncatedSVD] hỗ trợ hai thuật toán: bộ giải SVD ngẫu nhiên nhanh và thuật toán nai naive sử dụng ARPACK làm eigensolver trên (X * XT) hoặc (XT * X), tùy theo cái nào nhiều hơn hiệu quả. ". Về PCA, nó nói: "Giảm kích thước tuyến tính bằng cách sử dụng Phân tách giá trị số ít của dữ liệu để chiếu nó ...". Và triển khai PCA hỗ trợ hai bộ giải thuật toán ngẫu nhiên (ngẫu nhiên và ARPACK) cộng với một bộ giải khác, LAPACK. Nhìn vào mã tôi có thể thấy rằng cả ARPACK và LAPACK trong cả PCA và TruncatedSVD đều thực hiện svd trên dữ liệu mẫu X, ARPACK có thể xử lý các ma trận thưa thớt (sử dụng svds).
Vì vậy, ngoài các thuộc tính và phương thức khác nhau và PCA còn có thể thực hiện phân tách giá trị số ít đầy đủ chính xác bằng cách sử dụng các triển khai scikit-learn LAPACK, PCA và TruncatedSVD có vẻ giống hệt thuật toán. Câu hỏi đầu tiên: Điều này có đúng không?
Câu hỏi thứ hai: mặc dù LAPACK và ARPACK sử dụng scipy.linalg.svd (X) và scipy.linalg.svds (X), là X ma trận mẫu, họ tính toán phân hủy giá trị số ít hoặc Eigen-phân hủy của hoặc trong nội bộ. Trong khi bộ giải "ngẫu nhiên" không cần tính toán sản phẩm. (Điều này có liên quan đến sự ổn định bằng số, xem Tại sao PCA của dữ liệu bằng phương tiện SVD của dữ liệu? ). Điều này có đúng không?
Mã có liên quan: PCA dòng 415. TruncatedSVD dòng 137.