Nói một cách rộng rãi, có hai cách tiếp cận để tính toán phân tách giá trị riêng hoặc giá trị số ít. Một cách tiếp cận là chéo hóa ma trận và điều này về cơ bản mang lại toàn bộ phân rã giá trị riêng / giá trị đơn (toàn bộ phổ eigenvalue), xem một số tổng quan ở đây: Các thuật toán hiệu quả để tính toán phân rã giá trị số đơn (SVD) là gì? Cách khác là sử dụng thuật toán lặp để tạo ra một (hoặc một vài) hàm riêng mỗi lần. Lặp lại có thể được dừng lại sau khi số lượng các hàm riêng mong muốn đã được tính toán.
Tôi không nghĩ rằng có các thuật toán lặp đặc biệt cho SVD. Điều này là do người ta có thể tính toán SVD của một ma trận B bằng cách thực hiện một eigendecomposition của một đối xứng vuông ( n + m ) × ( n + m ) ma trận A = ( 0 B B ⊤ 0 ) . Do đó thay vì hỏi những gì các thuật toán tính toán cắt ngắn SVD, bạn nên hỏi những gì lặp đi lặp lại các thuật toán tính toán eigendecomposition: thuật toán cho cắt ngắn SVD ≈ lặp đi lặp lại thuật toán cho eigendecomposition .n×mB(n+m)×(n+m)
A=(0B⊤B0).
algorithm for truncated SVD≈iterative algorithm for eigendecomposition.
Thuật toán lặp đơn giản nhất được gọi là lặp công suất và thực sự rất đơn giản:
- Khởi tạo ngẫu nhiên x .
- Cập nhật x←Ax .
- Normalize x←x/∥x∥ .
- Bước Goto # 2 trừ khi hội tụ.
Tất cả các thuật toán phức tạp hơn cuối cùng đều dựa trên ý tưởng lặp lại sức mạnh, nhưng lại khá phức tạp. Toán học cần thiết được đưa ra bởi không gian con Krylov . Các thuật toán là phép lặp Arnoldi (đối với ma trận không đối xứng vuông), phép lặp Lanczos (đối với ma trận đối xứng hình vuông) và các biến thể của chúng, ví dụ như "phương pháp Lanczos khởi động lại ngầm" và không có gì.
Bạn có thể tìm thấy điều này được mô tả trong ví dụ như các sách giáo khoa sau:
- Golub & Van Loan, Tính toán ma trận
- Trefethen & Bau, Đại số tuyến tính số
- Demmel, ứng dụng đại số tuyến tính số
- Saad, Phương pháp số cho các vấn đề Eigenvalue lớn
Tất cả các ngôn ngữ lập trình hợp lý và các gói thống kê (Matlab, R, Python numpy, bạn đặt tên cho nó) sử dụng cùng các thư viện Fortran để thực hiện phân tách giá trị eigen / số ít. Đây là LAPACK và ARPACK . ARPACK là viết tắt của ARnoldi PACKage, và đó là tất cả về các lần lặp Arnoldi / Lanczos. Ví dụ, trong Matlab có hai hàm cho SVD: svd
thực hiện phân tách hoàn toàn thông qua LAPACK và svds
tính toán một số vectơ số ít nhất định thông qua ARPACK và nó thực sự chỉ là một trình bao bọc cho mộteigs
cuộc gọi trên ma trận "vuông góc".
Cập nhật
BAABA
Cũng có một thư viện Fortran cho các phương thức này, nó được gọi là PROPACK :
Gói phần mềm PROPACK chứa một tập hợp các hàm để tính toán phân rã giá trị số ít của các ma trận lớn và thưa thớt hoặc có cấu trúc. Các thói quen SVD dựa trên thuật toán hai chiều của Lanczos với tái cấu trúc lại một phần (BPRO).
Tuy nhiên, PROPACK dường như ít tiêu chuẩn hơn ARPACK và không được hỗ trợ về mặt ngôn ngữ lập trình chuẩn. Nó được viết bởi Rasmus Larsen, người có một bản phân tích hai chiều Lanczos dài 90 trang năm 1998 với tính tái cấu trúc một phần với những gì có vẻ là một tổng quan tốt. Cảm ơn @MichaelGrant thông qua chuỗi SE Khoa học tính toán này .
Trong số các bài báo gần đây, phổ biến nhất dường như là Baglama & Reichel, 2005, Augmented đã khởi động lại các phương pháp đấu thầu chéo Lanczos , có lẽ là xung quanh tình trạng của nghệ thuật. Cảm ơn @Dougal đã cho liên kết này trong các bình luận.
Cập nhật 2
Thực sự có một cách tiếp cận hoàn toàn khác được mô tả chi tiết trong bài viết tổng quan mà bạn tự trích dẫn: Halko et al. 2009, Tìm cấu trúc với tính ngẫu nhiên: Các thuật toán xác suất để xây dựng các phân tách ma trận gần đúng . Tôi không biết đủ về nó để bình luận.