Cách nhanh nhất để tính giá trị riêng lớn nhất của ma trận chung là gì?


27

EDIT: Tôi đang thử nghiệm nếu bất kỳ giá trị riêng nào có độ lớn bằng một hoặc lớn hơn.

Tôi cần tìm giá trị riêng tuyệt đối lớn nhất của một ma trận lớn không đối xứng thưa thớt.

Tôi đã sử dụng eigen()chức năng của R , sử dụng thuật toán QR từ EISPACK hoặc LAPACK để tìm tất cả các giá trị riêng và sau đó tôi sử dụng abs()để có được các giá trị tuyệt đối. Tuy nhiên, tôi cần phải làm nó nhanh hơn.

Tôi cũng đã thử sử dụng giao diện ARPACK trong igraphgói R. Tuy nhiên, nó đã báo lỗi cho một trong các ma trận của tôi.

Việc thực hiện cuối cùng phải được truy cập từ R.

Có lẽ sẽ có nhiều giá trị riêng có cùng độ lớn.

Bạn có đề nghị nào không?

EDIT: Độ chính xác chỉ cần là 1e-11. Một ma trận "điển hình" cho đến nay đã là . Tôi đã có thể thực hiện một yếu tố QR trên đó. Tuy nhiên, nó cũng có thể có những cái lớn hơn nhiều. Tôi hiện đang bắt đầu đọc về thuật toán Arnoldi. Tôi hiểu rằng nó có liên quan đến Lanczsos.386×386

EDIT2: Nếu tôi có nhiều ma trận mà tôi đang "thử nghiệm" và tôi biết rằng có một hàm con lớn không thay đổi. Có thể bỏ qua / loại bỏ nó?


Xem câu trả lời của tôi ở đây: scicomp.stackexchange.com/a/1679/979 . Đây là một chủ đề nghiên cứu hiện tại và phương pháp hiện tại có thể làm tốt hơn Lanczos. Vấn đề tính toán các giá trị số ít tương đương với vấn đề tính toán giá trị bản địa.
dranxo

2
Ma trận 400x400! = Lớn. Ngoài ra, điều gì có nghĩa lớn nhất nếu "Có thể sẽ có nhiều giá trị riêng có cùng độ lớn."? Trong vùng đất numpy: linalg.eig (Random.n normal (size = (400,400))) mất khoảng nửa giây. Đây có phải là quá chậm?
meawoppl

@meawoppl có nửa giây là quá chậm. Điều này là do nó là một phần của thuật toán khác chạy phép tính này nhiều lần.
sức mạnh

1
@power gotcah. Bạn có một xấp xỉ với eigenvector. tức là nó có khả năng tương tự như giải pháp cuối cùng, hoặc bạn có thể đoán được về cấu trúc của nó không?
meawoppl

Câu trả lời:


14

Nó phụ thuộc rất nhiều vào kích thước của ma trận của bạn, trong trường hợp quy mô lớn cũng phụ thuộc vào việc nó có thưa thớt hay không, và vào độ chính xác mà bạn muốn đạt được.

Nếu ma trận của bạn quá lớn để cho phép một yếu tố duy nhất và bạn cần độ chính xác cao, thuật toán Lanczsos có lẽ là cách nhanh nhất. Trong trường hợp không đối xứng, cần có thuật toán Arnoldi, không ổn định về số lượng, do đó, việc triển khai cần phải giải quyết vấn đề này (hơi khó xử lý).

Nếu đây không phải là vấn đề trong vấn đề của bạn, hãy cung cấp thông tin cụ thể hơn trong câu hỏi của bạn. Sau đó thêm một nhận xét cho câu trả lời này và tôi sẽ cập nhật nó.

Chỉnh sửa: [Đây là phiên bản cũ của câu hỏi, tìm kiếm giá trị riêng lớn nhất.] Vì ma trận của bạn nhỏ và có vẻ dày đặc, tôi thực hiện lặp Arnoldi trên B = (IA) ^ {- 1}, sử dụng chữ cái đầu hoán vị hệ số tam giác của IA để nhân với giá rẻ bằng B. (Hoặc tính toán nghịch đảo rõ ràng, nhưng chi phí này gấp 3 lần so với hệ số hóa.) Bạn muốn kiểm tra xem B có giá trị riêng âm hay không. Làm việc với B thay cho A, các giá trị riêng âm được phân tách tốt hơn nhiều, vì vậy nếu có một, bạn nên hội tụ nhanh chóng.

Nhưng tôi tò mò về vấn đề của bạn đến từ đâu. Ma trận không đối xứng thường có giá trị riêng phức tạp, do đó, '' lớn nhất '' thậm chí không được xác định rõ. Do đó, bạn phải biết nhiều hơn về vấn đề của mình, điều này có thể giúp gợi ý cách giải quyết vấn đề nhanh hơn và / hoặc đáng tin cậy hơn.

Edit2: Thật khó để có được với Arnoldi một tập hợp con quan tâm cụ thể . Để có được giá trị riêng hoàn toàn lớn nhất một cách đáng tin cậy, bạn sẽ thực hiện phép lặp không gian con bằng cách sử dụng ma trận gốc, với kích thước không gian con khớp hoặc vượt quá số lượng giá trị riêng dự kiến ​​sẽ gần bằng 1 hoặc lớn hơn. Trên các ma trận nhỏ, điều này sẽ chậm hơn thuật toán QR nhưng trên các ma trận lớn thì nó sẽ nhanh hơn nhiều.


Tôi cần kiểm tra xem giá trị riêng lớn nhất có lớn hơn 1. Độ chính xác chỉ cần là 1e-11. Một ma trận "điển hình" cho đến nay là 386 x 386. Tôi đã có thể thực hiện một yếu tố QR trên nó. Tuy nhiên, nó cũng có thể có những cái lớn hơn nhiều. Tôi hiện đang bắt đầu đọc về thuật toán Arnoldi. Tôi hiểu rằng nó có liên quan đến Lanczsos.
sức mạnh

Thông tin này thuộc về câu hỏi của bạn - vì vậy vui lòng chỉnh sửa nó và cũng thêm thông tin (tại sao giá trị bản địa là thật? Hoặc lớn nhất có nghĩa là gì?) - xem phần chỉnh sửa câu trả lời của tôi.
Arnold Neumaier

xin lỗi vì tôi đã không giải thích rõ ràng Tôi cũng không giải thích rõ ràng rằng giá trị bản địa rất phức tạp. Tôi đang thử nghiệm nếu bất kỳ giá trị riêng nào có độ lớn bằng một hoặc lớn hơn.
sức mạnh

1
Điều này có ý nghĩa hơn, nhưng bây giờ công thức của tôi với hoạt động tốt nếu giá trị riêng thực sự kém thực sự> 1. Mặt khác, thông tin mới có thể ngụ ý rằng bạn có ít sự lựa chọn nhưng tính toán tất cả các giá trị bản địa. - Vui lòng cập nhật câu hỏi của bạn để truyền đạt thông tin bổ sung! (IA)1
Arnold Neumaier

1
xem chỉnh sửa 2 trong câu trả lời của tôi
Arnold Neumaier

7

Các điện Iteration (hay Method Power), ví dụ như những gì Dan được mô tả, nên luôn luôn hội tụ, mặc dù theo tỷ giá .|λn1/λn|

Nếu là gần bước sóng n , nó sẽ bị chậm, nhưng bạn có thể sử dụng ngoại suy để có được xung quanh đó. Nó có vẻ phức tạp, nhưng việc thực hiện mã giả được đưa ra trong bài báo.λn1λn


1
nếu như | λ (n 1) | = | λ (n) | ?
sức mạnh

@power, sau đó Power Iteration thông thường sẽ không hội tụ. Tôi không biết các phương pháp ngoại suy sẽ phân biệt tốt như thế nào giữa các giá trị riêng khác nhau, bạn sẽ phải đọc bài báo đó.
Pedro

2
@power: Tất cả mọi thứ được xem xét lại, nếu , sau đó lặp lại sức mạnh sẽ vẫn hội tụ đến giá trị riêng. Eigenvector kết quả, mà bạn dường như không quan tâm đến dù sao, sẽ là một kết hợp tuyến tính của các hàm riêng tương ứng với λ nλ n - 1 . |λn1|=|λn|λnλn1
Pedro

Bạn có một tài liệu tham khảo cho một bài báo học thuật hoặc cuốn sách hỗ trợ này? Ngoài ra, nếu \ lambda_ {n} là phức tạp thì sao?
sức mạnh

5
Nếu có một số giá trị riêng khác nhau của mô đun cực đại, phép lặp công suất chỉ hội tụ trong các trường hợp đặc biệt. Nó thường dao động theo cách hơi khó đoán.
Arnold Neumaier

5

Gần đây đã có một số nghiên cứu tốt về điều này. Các cách tiếp cận mới sử dụng "thuật toán ngẫu nhiên" chỉ yêu cầu một vài lần đọc ma trận của bạn để có được độ chính xác tốt trên các giá trị riêng lớn nhất. Điều này trái ngược với các lần lặp công suất đòi hỏi một số phép nhân vectơ ma trận để đạt độ chính xác cao.

Bạn có thể đọc thêm về nghiên cứu mới ở đây:

http: //math.ber siêu.edu / ~ strain / 733

http://arxiv.org/abs/0909.4061

Mã này sẽ làm điều đó cho bạn:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com.vn/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decysis.html

Nếu ngôn ngữ bạn chọn không có trong đó, bạn có thể cuộn SVD ngẫu nhiên của riêng mình khá dễ dàng; nó chỉ yêu cầu một phép nhân vectơ ma trận theo sau là một cuộc gọi đến một SVD ngoài luồng.


4

Ở đây bạn sẽ tìm thấy một giới thiệu thuật toán cho thuật toán Jacobi-Davidson, tính toán giá trị riêng tối đa.

Trong bài báo này các khía cạnh toán học được khám phá. JD cho phép các ma trận tổng quát (thực hoặc phức tạp) và có thể được sử dụng để tính toán các phạm vi giá trị riêng.

Ở đây bạn có thể tìm thấy các triển khai thư viện khác nhau JDQR và JDQZ (bao gồm giao diện C, mà bạn sẽ có thể liên kết đến từ R).


Tôi đã không thể tìm thấy bất kỳ tài liệu nào nói rõ rằng phương pháp Jacobi-Davidson hoạt động cho một ma trận thực, chung.
sức mạnh

Trừ khi mọi bài viết đều nêu rõ ràng một hạn chế và đối số hội tụ phụ thuộc vào hạn chế không quan trọng.
Deathbreath

Đây là một lời giải thích khác của JD. Các ma trận được coi là hoàn toàn chung chung. Không có cấu trúc đặc biệt nào được khai thác và kết quả cụ thể đối với ma trận Hermiti được so sánh và đối chiếu, ví dụ, sự hội tụ cho ma trận chung là bậc hai, nhưng hình khối cho ma trận Hermiti.
Deathbreath

cảm ơn vì điều đó. Tôi không tìm thấy bất kỳ mã C nào cho một ma trận chung, vì vậy tôi sẽ phải tự viết. Các liên kết đến các thuật toán dường như chỉ dành cho ma trận Hermetian.
sức mạnh

1
@power bạn cũng sẽ không tìm thấy trong tài liệu một kết quả nói rằng việc triển khai QR tiêu chuẩn hội tụ cho một ma trận chung, thực - đó là một vấn đề mở, và thực sự cách đây không lâu, một ví dụ đã được tìm thấy cho mã QR trong LAPACK.
Federico Poloni

2

Trong bài viết gốc của bạn, bạn nói:

"Tôi cũng đã thử sử dụng giao diện ARPACK trong gói igraph R. Tuy nhiên, nó đã báo lỗi cho một trong các ma trận của tôi."

Tôi sẽ quan tâm để biết thêm về lỗi. Nếu bạn có thể công khai ma trận này ở đâu đó, tôi sẽ muốn thử ARPACK trên nó.

Dựa trên những gì tôi đã đọc ở trên, tôi hy vọng ARPACK sẽ làm rất tốt việc trích xuất các giá trị riêng lớn nhất (hoặc một vài trong số lớn nhất) của một ma trận thưa thớt. Cụ thể hơn, tôi mong muốn các phương pháp của Arnoldi hoạt động tốt trong trường hợp này và tất nhiên, đó là những gì ARPACK dựa trên.

Sự hội tụ chậm của phương pháp sức mạnh khi có các giá trị riêng biệt gần nhau trong khu vực quan tâm đã được đề cập ở trên. Arnoldi cải thiện điều này bằng cách lặp lại với một vài vectơ thay vì một vectơ trong phương thức sức mạnh.


Tôi sẽ xem nếu tôi có thể tìm thấy công việc của tôi từ đó trở lại. Tôi đã làm việc này một năm trước.
sức mạnh

0

Đây không phải là cách nhanh nhất , nhưng một cách nhanh chóng hợp lý là chỉ cần nhấn một vectơ (ban đầu ngẫu nhiên) với ma trận liên tục, và sau đó bình thường hóa cứ sau vài bước. Cuối cùng, nó sẽ hội tụ đến hàm riêng lớn nhất và mức tăng trong định mức cho một bước duy nhất là giá trị riêng liên quan.

Điều này hoạt động tốt nhất khi giá trị riêng lớn nhất lớn hơn đáng kể so với bất kỳ giá trị riêng nào khác. Nếu một giá trị riêng khác gần với độ lớn nhất, điều này sẽ mất một thời gian để hội tụ và có thể khó xác định xem nó hội tụ hay không.


1
Tuy nhiên, cảm ơn Dan: Trong ma trận của tôi, một số giá trị riêng khác sẽ có độ lớn tương tự (nếu không giống nhau) như lớn nhất. Phương thức của bạn có giống với Lặp lại Power và Lặp lại Quotient Quotient không? Batterson và Smillie (1990) viết rằng đối với một số ma trận không đối xứng, phép lặp Quotient Quotient sẽ không hội tụ. Batterson, S., Smillie, J (1990) "Rayleigh Quotient Iteration cho không đối xứng Ma trận", Toán của Tính, vol 55, num 191, P 169-178
điện

Nếu các giá trị riêng khác có cùng độ lớn với giá trị lớn nhất ... thì các giá trị đó cũng "giá trị lớn nhất" phải không?
ely

@EMS: Chúng vẫn sẽ là "giá trị riêng lớn nhất" nhưng sự hiện diện của nhiều hơn một lớn nhất vẫn sẽ giết chết sự hội tụ.
Dan

Tôi chỉ tự hỏi bạn muốn hội tụ về giá trị riêng nào. Những thứ như phương pháp thương lượng / công suất Rayleigh có nghĩa là khi có một giá trị riêng lớn nhất. Câu hỏi của bạn yêu cầu tìm giá trị riêng lớn nhất, nhưng có vẻ như điều này thực sự không được xác định rõ cho vấn đề của bạn. Tôi chỉ bị nhầm lẫn bởi tiêu đề của bài viết.
ely

-1

Gói R RACKACK hoạt động với tôi. Và nó dường như rất nhanh vì nó chỉ là một giao diện cho ARPACK, gói tiêu chuẩn cho đại số tuyến tính thưa thớt (có nghĩa là tính toán một vài giá trị riêng và hàm riêng).


Chào mừng đến với SciComp! Như câu hỏi nêu, ARPACK không hoạt động cho OP, vì vậy câu trả lời này không thực sự hữu ích.
Christian Clason

@HoangDT Câu hỏi này có trước rpegACK
sức mạnh vào
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.