2012-11-07 28 views
9

tôi thấy rằng đang có hai phiên bản của pinv() chức năng này sẽ tính giả nghịch đảo của một ma trận trong Scipynumpy, các tài liệu có thể được xem tại địa chỉ:Sự khác biệt của giả nghịch đảo giữa scipy và NumPy

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.pinv.html

http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.pinv.html

vấn đề là tôi có một ma trận 50000 * 5000, khi sử dụng scipy.linalg.pinv, nó chi phí cho tôi hơn 20GB bộ nhớ. Nhưng khi tôi sử dụng numpy.linalg.pinv, chỉ ít hơn 1 GB bộ nhớ được sử dụng ..

Tôi đã tự hỏi tại sao numpyscipy cả hai đều có pinv khi triển khai khác nhau. Và tại sao màn trình diễn của họ quá khác biệt.

Trả lời

10

Tôi không thể nói tại sao có các triển khai trong cả hai scipy và gumpy, nhưng tôi có thể giải thích lý do tại sao các hành vi là khác nhau.

numpy.linalg.pinv xấp xỉ psuedo nghịch đảo Moore-Penrose sử dụng một SVD (phương pháp LAPACK dgesdd để được chính xác), trong khi scipy.linalg.pinv giải quyết một hệ thống mô hình tuyến tính trong bình phương tối thiểu để xấp xỉ cảm nghịch đảo giả (sử dụng dgelss). Đây là lý do tại sao hiệu suất của họ là khác nhau. Tôi hy vọng độ chính xác tổng thể của các ước tính nghịch đảo giả kết quả là hơi khác nhau.

Bạn có thể thấy rằng scipy.linalg.pinv2 hoạt động tương tự như numpy.linalg.pinv, vì nó cũng sử dụng phương pháp SVD, thay vì xấp xỉ ít nhất là sqaures.

+0

phương pháp 'SVD' và phương pháp' nhỏ nhất', cái nào tốt hơn .. –

+0

"tốt hơn" là một thuật ngữ rất chủ quan. Chỉ có bạn biết những gì bạn cần giả đảo ngược cho ở nơi đầu tiên. Có lẽ bạn cũng có các tiêu chí về hiệu suất và tính ổn định số của các thuật toán của bạn. Cho dù cái nào là "tốt hơn" là cái tốt nhất đáp ứng tiêu chí của bạn. – talonmies

Các vấn đề liên quan