Những thuật toán nhanh nào tồn tại để tính toán SVD bị cắt ngắn?


14

Có thể lạc đề ở đây, nhưng đã tồn tại một số ( một , hai ) câu hỏi liên quan.

Trêu chọc trong tài liệu (hoặc tìm kiếm trên google về Thuật toán SVD bị cắt) xuất hiện rất nhiều bài viết sử dụng các SVD bị cắt theo nhiều cách khác nhau và tuyên bố (bực bội, thường không có trích dẫn) rằng có thuật toán nhanh để tính toán, nhưng không ai biết dường như đang chỉ vào những thuật toán đó là gì

Điều duy nhất tôi có thể tìm thấy là một thuật toán ngẫu nhiên duy nhất , được sử dụng trong thư viện redSVD .

Những gì tôi muốn thấy là một tập hợp các thuật toán chính xác và không chính xác, phù hợp để hiểu cách các hệ thống hoạt động (nhưng không nhất thiết phải thực sự triển khai chúng tất nhiên!).

Có ai có một tài liệu tham khảo tốt cho loại điều này?


Nếu tôi muốn lưu trữ dữ liệu tốt, tôi sử dụng cây b (hoặc rb-cây) trong hàm băm (nghĩ về ram). Nếu tôi có một cây b cho dữ liệu, thì tôi có thể trong các lượng tử mẫu thời gian O (log (n)) và như vậy. Tôi cá rằng với dữ liệu lớn, việc lấy mẫu như vậy có thể được sử dụng để tính toán xấp xỉ thưa thớt cho các ma trận svd trong thời gian ngắn. Bạn cũng có thể tra cứu "cảm biến nén", một cách tiếp cận thống kê để nén dữ liệu cực độ.
EngrStudent - Phục hồi Monica

Bằng cách rút ngắn SVD, bạn có nghĩa là bạn chỉ quan tâm đến việc tìm kiếm một số vectơ / giá trị số ít hàng đầu, trái ngược với tất cả chúng?
amip nói rằng Phục hồi lại

@amoeba Yep, đó là ý tưởng.
John Doucette

Câu trả lời:


16

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=(0BB0).
algorithm for truncated SVDiterative 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:

  1. Khởi tạo ngẫu nhiên x .
  2. Cập nhật xAx .
  3. Normalize xx/x .
  4. 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:

  1. Golub & Van Loan, Tính toán ma trận
  2. Trefethen & Bau, Đại số tuyến tính số
  3. Demmel, ứng dụng đại số tuyến tính số
  4. 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à LAPACKARPACK . 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: svdthực hiện phân tách hoàn toàn thông qua LAPACK và svdstí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.


Lưu ý rằng có tồn tại các phương pháp lặp dành riêng cho SVD; ví dụ, Augmented hoàn toàn khởi động lại phương pháp đấu thầu Lanczos , J. Baglama và L. Reichel, SIAM J. Sci. Tính toán. 2005. (Tôi chưa đọc bài báo để biết liệu nó có khác biệt cơ bản với cách tiếp cận giá trị bản địa mà bạn đã đưa ra hay không, chỉ cần biết rằng mọi người thích phương pháp đó.)
Dougal

1
Cảm ơn vì đường link, @Dougal. Tôi nên nói rằng tôi không thực sự biết rõ về bất kỳ phương pháp nào trong số này, vì vậy không thể thực sự nhận xét về điều đó. Sẽ thật tuyệt nếu ai đó hiểu biết hơn sẽ giải thích mối quan hệ giữa các phương pháp lặp khác nhau. Theo tôi hiểu, phương pháp vanilla Lanczos là để tính toán giá trị riêng của ma trận vuông chứ không phải cho SVD; "Tăng cường khởi động lại Lanczos" nên liên quan chặt chẽ với nó, nhưng bạn đã đúng - dường như là trực tiếp về SVD. Không chắc làm thế nào nó phù hợp với nhau. Tôi sẽ cập nhật câu trả lời của mình nếu tôi nhìn kỹ hơn.
amip nói phục hồi Monica

1
@Dougal, tôi đã đọc một số chữ thảo và cập nhật.
amip nói rằng Phục hồi Monica

@amoeba sẽ "cắt bớt SVD" trong bối cảnh bình phương tối thiểu thường xuyên về cơ bản giống như "hồi quy thành phần nguyên tắc" ?
GeoMatt22

1
@amoeba Bạn có thể nhận xét về việc triển khai SVD ngẫu nhiên của Facebook không , một số người dường như nói rằng đó là một trong những giải pháp nhanh nhất có thể ngay bây giờ. Thật tuyệt nếu bạn có thể chỉnh sửa để bình luận về điều này.
Tim

4

Tôi chỉ vấp phải chủ đề thông qua các SVD nhanh, vì vậy tôi đang cố gắng tự mình tìm ra mọi thứ, nhưng có lẽ bạn nên xem xét gần đúng chéo thích ứng (ACA).

MM=i=0kUiViTN×NO(N) ). Vì vậy, nó thực sự nhanh chóng; Thật không may, nhiều người sử dụng từ "nhanh" nhẹ.

Một lần nữa, nó phụ thuộc vào vấn đề của bạn nếu điều đó làm việc. Trong nhiều trường hợp cá nhân tôi gặp phải, ACA là một công cụ số rất hữu ích.

Lưu ý: Tôi muốn viết bài này dưới dạng bình luận, nhưng vì tôi mới tạo tài khoản này nên tôi không đủ danh tiếng để bình luận ... Nhưng việc đăng bài hoạt động.


2

Đây là một kỹ thuật tôi đã sử dụng thành công trong quá khứ để tính toán một SVD bị cắt ngắn (trên bộ dữ liệu Netflix). Nó được lấy từ bài báo này . Trong cài đặt lọc cộng tác, tôi cần lưu ý rằng hầu hết các giá trị bị thiếu và vấn đề là dự đoán chúng , vì vậy, để sử dụng SVD bị cắt bớt để giải quyết vấn đề như vậy, bạn phải sử dụng một kỹ thuật hoạt động trong điều kiện đó. Mô tả ngắn:

  1. Trước khi bạn làm bất cứ điều gì, hãy điều chỉnh một mô hình đơn giản (ví dụ: giá trị hằng số trung bình + cột và hàng) và chỉ khi bạn đã thực hiện xong, bạn nên chuyển sang sử dụng SVD bị cắt bớt để phù hợp với phần dư.
  2. Khởi tạo một vectơ ngẫu nhiên có độ dài k (trong đó thứ hạng bạn cắt ngắn) cho từng hàng và cột (cho mỗi phim và người dùng trong trường hợp Netflix).
  3. Giữ các vectơ hàng cố định và cập nhật các vectơ cột để giảm thiểu lỗi ghi các mục đã biết trong ma trận. Các thủ tục được đưa ra trong mã MATLAB trong bài báo.
  4. Giữ các vectơ cột cố định và cập nhật các vectơ hàng theo cách tương tự.
  5. Lặp lại 3 & 4 cho đến khi bạn hội tụ hoặc nhận được kết quả đủ tốt.
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.