Hiểu cách Numpy làm SVD


13

Tôi đã sử dụng các phương pháp khác nhau để tính cả thứ hạng của ma trận và nghiệm của hệ phương trình ma trận. Tôi đã xem qua chức năng linalg.svd. So sánh điều này với nỗ lực của tôi trong việc giải quyết hệ thống với Loại bỏ Gaussian, nó dường như vừa nhanh hơn và chính xác hơn. Tôi đang cố gắng để hiểu làm thế nào điều này là có thể.

Theo như tôi biết, hàm linalg.svd sử dụng thuật toán QR để tính toán giá trị riêng của ma trận của tôi. Tôi biết làm thế nào điều này hoạt động toán học, nhưng tôi không biết làm thế nào Numpy quản lý để làm điều đó nhanh chóng và không mất nhiều độ chính xác.

Vì vậy, câu hỏi của tôi: Hàm numpy.svd hoạt động như thế nào, và cụ thể hơn, làm thế nào để quản lý để thực hiện nhanh và chính xác (so với loại bỏ gaussian)?


2
numpy sử dụng thói quen Lapack dgesddcho các SVD có giá trị thực. Vì vậy, câu hỏi thực sự của bạn có lẽ là "Lapack dgesdd hoạt động như thế nào?", Và đó là chủ đề khá hay cho stackoverflow.
Talonmies

Nếu bạn thực sự tò mò, tôi sẽ đề nghị kiểm tra nguồn LAPACK.

Cảm ơn bạn đã cho ý kiến ​​của bạn, và lời xin lỗi của tôi Tôi không bình thường.
RobVerheyen

Bài đăng này là một bài đăng chéo từ Stack Overflow . Việc đăng chéo thường không được khuyến khích trên các trang web Stack Exchange. Giao thức chuẩn để đăng lại một câu hỏi trên một trang web khác là đóng, xóa hoặc di chuyển bài đăng gốc trước khi cố gắng đăng lại trên một trang web khác. (Nếu bạn di chuyển câu hỏi, nó sẽ được đăng lại tự động.)
Geoff Oxberry

Tôi xin lỗi, tôi không nhận thức được giao thức. Tôi hy vọng tôi vẫn có thể nhận được một câu trả lời.
RobVerheyen

Câu trả lời:


15

Có một số vấn đề trong câu hỏi của bạn.

Không sử dụng Loại bỏ Gaussian (hệ số LU) để tính thứ hạng số của ma trận. Hệ số LU không đáng tin cậy cho mục đích này trong số học dấu phẩy động. Thay vào đó, hãy sử dụng phân tách QR tiết lộ thứ hạng (chẳng hạn như xGEQPXhoặc xGEPQYtrong LAPACK, trong đó x là C, D, S hoặc Z, mặc dù những thói quen đó rất khó theo dõi; xem câu trả lời của JedBrown về câu hỏi liên quan ) hoặc sử dụng SVD (phân tách giá trị số ít, chẳng hạn như xGESDDhoặc xGESVD, trong đó x lại là C, D, S hoặc Z). SVD là một thuật toán chính xác, đáng tin cậy hơn để xác định thứ hạng số, nhưng nó đòi hỏi nhiều thao tác dấu phẩy động hơn.

Tuy nhiên, để giải quyết một hệ thống tuyến tính, hệ số LU (với trục xoay một phần, là triển khai tiêu chuẩn trong LAPACK) là cực kỳ đáng tin cậy trong thực tế. Có một số trường hợp bệnh lý mà hệ số LU với trục xoay một phần không ổn định (xem Bài giảng 22 trong Đại số tuyến tính sốbởi Trefethen và Bau để biết chi tiết). Yếu tố QR là một thuật toán số ổn định hơn để giải quyết các hệ thống tuyến tính, đó có thể là lý do tại sao nó mang lại cho bạn kết quả chính xác như vậy. Tuy nhiên, nó đòi hỏi nhiều phép toán dấu phẩy động hơn hệ số LU theo hệ số 2 cho ma trận vuông (tôi tin rằng; JackPoulson có thể sửa cho tôi về điều đó). Đối với các hệ thống hình chữ nhật, hệ số QR là một lựa chọn tốt hơn bởi vì nó sẽ mang lại các giải pháp bình phương nhỏ nhất cho các hệ thống tuyến tính quá hạn. SVD cũng có thể được sử dụng để giải quyết các hệ thống tuyến tính, nhưng nó sẽ đắt hơn so với hệ số QR.

janneb là chính xác rằng numpy.linalg.svd là một trình bao bọc xGESDDtrong LAPACK. Phân rã giá trị số ít tiến hành trong hai giai đoạn. Đầu tiên, ma trận cần phân tách được giảm xuống dạng hai chiều. Thuật toán được sử dụng để giảm xuống dạng hai chiều trong LAPACK có lẽ là thuật toán Lawson-Hanson-Chan và nó sử dụng hệ số QR tại một điểm. Bài giảng 31 trong Đại số tuyến tính số của Trefethen và Bau đưa ra một cái nhìn tổng quan về quá trình này. Sau đó, xGESDDsử dụng thuật toán chia và chinh phục để tính các giá trị số ít và các vectơ số đơn bên trái và bên phải từ ma trận hai chiều. Để có được nền tảng về bước này, bạn sẽ cần tham khảo Tính toán ma trận của Golub và Van Loan hoặc Đại số tuyến tính số ứng dụng của Jim Demmel.

Cuối cùng, bạn không nên nhầm lẫn các giá trị số ít với giá trị riêng . Hai bộ số lượng này không giống nhau. SVD tính toán các giá trị số ít của ma trận. Tính toán số của Cleve Moler với MATLAB cung cấp một cái nhìn tổng quan tốt đẹp về sự khác biệt giữa các giá trị số ít và giá trị riêng . Nói chung, không có mối quan hệ rõ ràng giữa các giá trị số ít của một ma trận nhất định và các giá trị riêng của nó, ngoại trừ trong các ma trận thông thường , trong đó các giá trị số ít là giá trị tuyệt đối của các giá trị riêng.


Tôi nghĩ rằng "không liên quan" là khá mạnh mẽ cho mối quan hệ giữa giá trị bản địa và giá trị số ít. Mối quan hệ này khá mơ hồ trừ khi bạn biết toàn bộ phân tách Jordan của ma trận, nhưng bạn có thể sử dụng một để lấy ước tính của cái kia nếu bạn có thông tin (hoặc sẵn sàng đưa ra các giả định) về phân tách Jordan nói.
Dan

Bạn sẽ đề nghị gì thay thế?
Geoff Oxberry

Trước hết, cảm ơn bạn đã trả lời công phu. Tôi phát hiện ra rằng tôi không thể sử dụng phân tách LU để xác định thứ hạng ma trận một cách khó khăn. Câu trả lời của bạn dường như ngụ ý rằng yếu tố QR trên thực tế sẽ là một phương pháp nhanh hơn để giải quyết vấn đề của tôi, đúng không? Có một lợi thế khác biệt trong việc sử dụng SVD? Tôi đã nhận thức rõ thực tế rằng các giá trị số ít không phải là giá trị riêng. Tôi đã đề cập đến thực tế là các giá trị số ít có thể được tính là giá trị riêng của ma trận nhân với nó chuyển từ bên trái. Tôi xin lỗi đã không rõ ràng.
RobVerheyen

Tôi có thể thêm rằng ma trận tôi đang giải quyết thực sự là số ít. Trong thực tế, thứ hạng ma trận chỉ bằng một nửa kích thước của ma trận. Có lẽ điều này làm cho một số phương pháp thích hợp hơn?
RobVerheyen

1
@RobVerheyen: QR sẽ chậm hơn LU, nhưng chính xác hơn đáng kể. SVD thậm chí sẽ chậm hơn QR, nhưng SVD được coi là phương pháp đáng tin cậy nhất để xác định thứ hạng số (ví dụ, MATLAB sử dụng SVD trong rankchức năng của nó ). Cũng có một chút thận trọng khi sử dụng một trong hai cách tiếp cận; trong cách tiếp cận SVD, thứ hạng số là số lượng giá trị số ít trên ngưỡng cắt cụ thể (thường là rất nhỏ). (Cách tiếp cận QR tương tự, nhưng thay thế các giá trị số ít bằng các mục chéo của ma trận R.)
Geoff Oxberry

8

Do từ ngữ của câu hỏi của bạn, tôi giả sử rằng ma trận của bạn là hình vuông. Các thói quen SVD của LAPACK, chẳng hạn như zgesvd , về cơ bản tiến hành theo ba giai đoạn cho ma trận vuông:

  1. UAVAAB:=UAHAVAUAVABO(n3)
  2. {UB,VB,Σ}B=UBΣVBHO(n2)O(n3)
  3. UABVAH=AA=(UAUB)Σ(VAVB)HBạnMộtVMộtBạnBVBÔi(n3)

7

numpy.linalg.svd là một trình bao bọc xung quanh {Z, D} GESDD từ LAPACK. LAPACK, lần lượt, được viết rất cẩn thận bởi một số chuyên gia hàng đầu thế giới về đại số tuyến tính số. Thật vậy, sẽ rất ngạc nhiên nếu ai đó không quen thuộc với lĩnh vực này sẽ thành công trong việc đánh bại LAPACK (về tốc độ hoặc độ chính xác).

Về lý do tại sao QR tốt hơn loại bỏ Gaussian, điều đó có lẽ phù hợp hơn với /scicomp//


Cảm ơn bạn đã trả lời và tham khảo. Tôi sẽ thử nó ở đó.
RobVerheyen
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.