Sự khác biệt giữa triển khai PCA và TruncatedSVD


12

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?XTXXXT

Mã có liên quan: PCA dòng 415. TruncatedSVD dòng 137.


1
bạn có thể thêm một liên kết đến mã
seanv507

1
Drainke - Tôi nghĩ rằng tôi đồng ý với bạn về Q. đầu tiên không hiểu thứ hai. Ý bạn là gì 'họ tính toán phân tách giá trị số ít hoặc phân rã bản địa của XT ∗ XXT ∗ X hoặc X ∗ XTX ∗ XT trong nội bộ' - bạn vừa hiển thị mã trong đó tất cả được thực hiện bằng cách sử dụng SVD trên X? - các vấn đề về số đề cập đến ma trận hiệp phương sai điện toán đầu tiên (gọi nó là C) sau đó tìm các hàm riêng của C
seanv507

@ seanv507 Về câu hỏi thứ 2 - Tôi đoán rằng scipy.linalg.svd (X) tính toán svd bằng cách làm như eigen-phân hủy của hoặc / và . Điều tương tự cho linalg.svds (X). Trích dẫn: "một trình giải SVD ngẫu nhiên nhanh, và thuật toán nghén ngây thơ sử dụng ARPACK làm eigensolver trên (X * XT) hoặc (XT * X)". Xem thêm dòng cuối cùng trong docs.scipy.org/doc/scipy/reference/generated/ mẹo . Cách duy nhất tôi có thể hiểu được trích dẫn đầu tiên là các thuật toán ngẫu nhiên là người duy nhất mà không tính hiệp phương sai / gram ma trậnX X TXTXXXT
drake

1
XXtimes()Xt_times()

@ GeoMatt22 Bạn có thể giải thích về nhận xét của bạn? Bạn có nghĩa là các phương pháp ARPACK hoặc LAPACK không bị mất ổn định về số vì chúng không cần tính toán ma trận hiệp phương sai?
Drake

Câu trả lời:


13

Các triển khai scikit-learn PCA và TruncatedSVD dường như giống hệt thuật toán.

Không: PCA là (cắt ngắn) SVD trên dữ liệu trung tâm (theo cơ sở trung bình theo tính năng). Nếu dữ liệu đã được căn giữa, hai lớp đó sẽ làm như vậy.

Trong thực tế TruncatedSVDlà hữu ích trên các bộ dữ liệu thưa thớt lớn mà không thể tập trung mà không làm cho việc sử dụng bộ nhớ phát nổ.

  • numpy.linalg.svdscipy.linalg.svdcả hai đều dựa vào LAPACK _GESDD được mô tả tại đây: http://www.netlib.org/lapack/lug/node32.html (chia và chinh phục trình điều khiển)

  • scipy.sparse.linalg.svdsdựa vào ARPACK để thực hiện phân rã giá trị bản địa của XT. X hoặc X. Xt (tùy thuộc vào hình dạng của dữ liệu) thông qua phương pháp lặp Arnoldi. Hướng dẫn sử dụng HTML của ARPACK có định dạng bị hỏng, ẩn các chi tiết tính toán nhưng phép lặp Arnoldi được mô tả tốt trên wikipedia: https://en.wikipedia.org/wiki/Arnoldi_iteration

Đây là mã cho SVD dựa trên ARPACK trong scipy:

https://github.com/scipy/scipy/blob/master/scipy/spzzy/linalg/eigen/arpack/arpack.py#L1642 (tìm kiếm chuỗi "def svds" trong trường hợp thay đổi dòng trong mã nguồn ).


2
Một cái có thể hỗ trợ dữ liệu thưa thớt một cách hiệu quả (TruncatedSVD), cái kia không thể (PCA). Đây là lý do tại sao chúng tôi có 2 lớp.
ogrisel

1
Nếu đó là lý do, thì tôi sẽ gọi chúng là SVD và SpzzySVD (hoặc tương tự) để tránh nhầm lẫn.
cơn mưa

2
Nhưng mọi người muốn PCA và họ có thể không biết rằng PCA chỉ là SVD trên dữ liệu trung tâm.
ogrisel

5
@drake Tôi không đồng ý rằng "các quy trình là khác nhau (PCA sử dụng ma trận hiệp phương sai và SVD sử dụng ma trận dữ liệu)". PCA là tên của loại phân tích. Người ta có thể sử dụng các thuật toán và triển khai khác nhau để thực hiện nó. EIG của ma trận cov là một phương thức, SVD của ma trận dữ liệu trung tâm là một phương thức khác, và sau đó EIG và SVD cũng có thể được thực hiện bằng nhiều phương pháp khác nhau. Không quan trọng - tất cả đó là PCA.
amip nói rằng Phục hồi lại

1
@amoeba Cảm ơn bạn đã làm rõ / sửa chữa về thuật ngữ. Những gì bạn nói có ý nghĩa hơn đối với tôi, vì SVD và EIG là các định lý / phương pháp đại số với phạm vi rộng hơn PCA
rake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.