Bộ nhớ triển khai hiệu quả phân tách giá trị số một phần (SVD)


10

Để giảm mô hình, tôi muốn tính các vectơ số đơn bên trái liên quan đến giá trị số ít nhất 20 - của ma trận , trong đó và . Thật không may, ma trận của tôi sẽ dày đặc mà không có cấu trúc nào.ARN,kN106k103A

Nếu tôi chỉ gọi svdthường trình từ numpy.linalgmô-đun trong Python cho một ma trận ngẫu nhiên có kích thước này, thì tôi gặp phải lỗi bộ nhớ. Điều này là do sự phân bổ của cho phép phân tách . A = V S UVRN,NA=VSU

Có thuật toán xung quanh, mà tránh được cạm bẫy này? Ví dụ: bằng cách chỉ thiết lập các vectơ số ít được liên kết với các giá trị số ít khác.

Tôi đã sẵn sàng để giao dịch trong thời gian tính toán và độ chính xác.


1
Thật thú vị, có vẻ như Numpy không biết làm thế nào để làm một SVD mỏng ...
JM

Cảm ơn đã gợi ý. Thật vậy, numpy.linalg.svd có tùy chọn full_matricesđược đặt thành Sai để chỉ các phần 'nonzero' được tính toán. Tuy nhiên, có cách nào để giảm tính toán hơn nữa?
ngày 1 tháng

3
Các numpyphụ trợ sử dụng mã fortran, LAPACKE_dgesvdthói quen cho svd tiêu chuẩn. Tuy nhiên, thông thường ma trận của bạn là C_CONTIGOUS(kiểm tra với matrix.flags). Do đó, nó sao chép dữ liệu để căn chỉnh fortran. Ngoài ra, trong khi chạy thói quen lapack, dgesvd một bản sao khác của ma trận của bạn là cần thiết (hoặc ít nhất là bộ nhớ cho nó). Bạn có thể thoát khỏi một bản sao nếu bạn chắc chắn rằng căn chỉnh bộ nhớ là kiểu fortran ngay từ đầu.
Bort

Câu trả lời:


6

Nếu bạn chỉ muốn một vài giá trị / vectơ số ít, ARPACK nên thực hiện thủ thuật. Các tài liệu SVD không tuyệt vời và bản phân phối này được cập nhật hơn.

EDIT: Nếu bạn muốn làm điều này trong python, SciPy có một trình bao bọc . Vì ma trận của bạn dày đặc, bạn có thể thử định dạng hàng thưa thớt (BSR).


Tôi sẽ có một cái nhìn, cách ARPACK tích hợp với python ...
Jan Jan

1
Hình như scipy có giấy gói. Tôi sẽ thêm chúng để trả lời cơ thể.
Max Hutchinson


2

Có lẽ bạn có thể thử điều này.

https://github.com/jakevdp/pypropack

Đây là một trình bao bọc Python cho gói PROPACK, thực hiện phân rã giá trị một phần hiệu quả của các ma trận thưa thớt lớn và các toán tử tuyến tính.


2

Intel MKL thực hiện thuật toán Jacobi-SVD mới. Dưới đây là chi tiết triển khai: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/doads/j02.pdf

Và thói quen LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

Quy mô làm việc tất nhiên là có thể điều chỉnh. Bạn có thể gọi các hàm C từ Python một cách dễ dàng bằng Cython, SWIG hoặc bất kỳ cơ chế gói nào khác.

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.