tính toán SVD bị cắt cụt, một giá trị số ít / vectơ tại một thời điểm


11

Có một thuật toán SVD rút gọn để tính toán các giá trị số một tại một thời điểm không?

Vấn đề của tôi: Tôi muốn tính các giá trị số ít đầu tiên (và các vectơ số ít) của một ma trận dày đặc M , nhưng tôi không biết giá trị thích hợp của k sẽ là gì. M là lớn, vì vậy, vì lý do hiệu quả, tôi thà không đánh giá toàn bộ SVD chỉ để cắt bớt các SV nhỏ nhất sau đó.kMkM

Lý tưởng nhất, sẽ có một cách để tính toán các giá trị số ít serially, từ lớn nhất ( σ 1 ) đến nhỏ ( σ n ). Bằng cách đó, tôi chỉ đơn giản là có thể ngăn chặn sự tính toán sau khi tính toán k thứ giá trị đơn lẻ nếu σ k / σ 1 giảm xuống dưới một số ngưỡng.σ1,σ2,σ1σnkσk/σ1

Có một thuật toán như vậy tồn tại (tốt nhất là với một triển khai Python)? Trong lúc loay hoay, tôi chỉ tìm thấy các hàm SVD bị cắt ngắn lấy k làm tham số, do đó buộc bạn phải đoán nó là tiên nghiệm.


M của bạn là hình vuông hay hình chữ nhật? Nếu hình chữ nhật, bạn muốn các vectơ đơn dài hay ngắn? Đó là, nếu M là (mxn) với m> n, bạn muốn (mxk) hay (kxn)?
Max Hutchinson

M là hình chữ nhật, có nhiều hàng hơn cột. Tôi muốn các vectơ số ít (ví dụ V, trong M = U S V ^ T).
SuperElectric

Câu trả lời:


6

Có một vài tùy chọn có sẵn nếu bạn muốn một hệ số thứ hạng gần đúng.

  1. Các yếu tố QR được tiết lộ mạnh mẽ
  2. Phân rã nội suy (ID) và các kỹ thuật ngẫu nhiên khác.

AMNTfactor×σk+1(A):=ϵ

Một hệ số gần đúng của mẫu trên có thể được chuyển đổi thành phân tách tiêu chuẩn như QR hoặc SVD bằng các kỹ thuật tiêu chuẩn. Một đánh giá tốt có sẵn trong bài báo của Halko, Martinsson và Tropp "Tìm cấu trúc một cách ngẫu nhiên: Các thuật toán xác suất để xây dựng phân tách ma trận gần đúng"

ϵ


2

(Đã chỉnh sửa, vì tôi đã đọc sai câu hỏi lúc đầu; bạn đã biết rằng có các thói quen có sẵn để tính các giá trị số ít đầu tiên .)k

Nếu bạn loại trừ cách tiếp cận tính toán toàn bộ SVD, các thuật toán SVD một phần sẽ giảm xuống bằng cách sử dụng các phương pháp lặp để giải quyết vấn đề eigenvalue liên quan. Vì vậy, một chiến lược bạn có thể thực hiện là tự mình viết mã loại điều này và tiếp tục giải quyết cho giá trị số ít chưa giải quyết lớn nhất còn lại cho đến khi bạn muốn dừng lại, sử dụng một cái gì đó như chiến lược thay đổi. Có thể có những cách thanh lịch để làm điều này trong các gói tinh vi như SLEPc .

Một chiến lược khác sẽ là như sau:

  • Tính giá trị số ít lớn nhất .s1
  • Đặt dung sai tuyệt đối của thói quen SVD thưa thớt thành , trong đó là ngưỡng của bạn và là một số yếu tố an toàn để xác định có bao nhiêu giá trị số ít có thể bạn muốn tính toán.τ 0 < f 1τs1fτ0<f1
  • Gọi thói quen SVD thưa thớt.

Nếu thói quen SVD thưa thớt tính toán một SVD mỏng (và tôi không thể hiểu tại sao nó lại không), thì chiến lược này cung cấp cho bạn tất cả các giá trị số ít bạn muốn (cộng với một số giá trị bổ sung), bởi vì các giá trị dưới mức dung sai tuyệt đối sẽ được coi là số không. Trong trường hợp đó, bạn có thể sử dụng scipy.spude.linalg.svds , lưu ý rằng là một tham số tùy chọn và bạn không phải chỉ định nó là một tiên nghiệm .k


Nếu bạn không chỉ định 'k' trong scipy.spude.linalg.svds, thì nó sẽ mặc định là k = 6, bất kể tham số 'tol'. Không rõ đây có phải là lỗi hay không, nếu 'tol' được cho là liên quan đến độ chính xác của các giá trị số ít được tính toán (thay vì kích thước của chúng)
Nick Alger
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.