Đường chéo của ma trận điều kiện dày đặc


10

Tôi đang cố gắng để chéo một số ma trận dày đặc, điều hòa. Trong độ chính xác của máy, kết quả không chính xác (trả về giá trị riêng âm, hàm riêng không có các đối xứng dự kiến). Tôi đã chuyển sang chức năng Eigensystem [] của Mathicala để tận dụng độ chính xác tùy ý, nhưng việc tính toán rất chậm. Tôi mở cho bất kỳ số lượng các giải pháp. Có các gói / thuật toán rất phù hợp với các vấn đề không có điều kiện? Tôi không phải là một chuyên gia về điều kiện tiên quyết, vì vậy tôi không chắc điều này có thể giúp được bao nhiêu. Mặt khác, tất cả những gì tôi có thể nghĩ đến là các bộ giải eigenvalue chính xác tùy ý song song, nhưng tôi không quen thuộc với bất cứ điều gì ngoài Mathematica, MATLAB và C ++.

Để đưa ra một số nền tảng về vấn đề này, các ma trận rất lớn, nhưng không lớn (nhiều nhất là 4096x4096 đến 32768x32768). Chúng là thực, đối xứng và các giá trị riêng được giới hạn trong khoảng từ 0 đến 1 (độc quyền), với nhiều giá trị riêng rất gần với 0 và không gần bằng 1. Ma trận về cơ bản là toán tử tích chập. Tôi không cần phải chéo tất cả các ma trận của mình, nhưng tôi càng lớn thì càng tốt. Tôi có quyền truy cập vào các cụm máy tính với nhiều bộ xử lý và khả năng tính toán phân tán.

Cảm ơn bạn


2
Những thói quen bạn đang sử dụng để chéo hóa ma trận đối xứng thực sự của bạn? Và theo nghĩa nào thì sự phân rã eigenvalue không chính xác?
Jack Poulson

Đây là một ý tưởng liên quan đến câu trả lời của Arnold: thực hiện phân tách Cholesky của ma trận SPD của bạn và sau đó tìm các giá trị số ít của tam giác Cholesky mà bạn vừa thu được, có thể sử dụng thuật toán loại dqd để bảo vệ độ chính xác.
JM

1
@JM: Hình thành bộ giải mã Cholesky của một ma trận xác định dương số đơn lẻ không ổn định về mặt số lượng với phương pháp thông thường, vì người ta có thể gặp các pivots âm. (Ví dụ, chollab của Matlab (A) thường thất bại.) Người ta sẽ phải đặt chúng về 0 và hủy các hàng tương ứng của các yếu tố. Làm điều này cung cấp một cách đáng tin cậy để có được không gian null số.
Arnold Neumaier

@Arnold, nếu bộ nhớ phục vụ, có các điều chỉnh của Cholesky sử dụng trục xoay đối xứng cho những trường hợp ma trận có giá trị bán xác định dương (hoặc gần như vậy). Có lẽ những thứ đó có thể được sử dụng ...
JM

@JM: Người ta không cần xoay vòng để giải quyết trường hợp semidefinite; công thức tôi đưa ra là đủ. Tôi chỉ muốn chỉ ra rằng người ta không thể sử dụng các chương trình đóng hộp tiêu chuẩn mà phải tự sửa đổi chúng.
Arnold Neumaier

Câu trả lời:


7

Tính toán SVD thay cho phân rã phổ. Các kết quả giống nhau về số học chính xác, vì ma trận của bạn là xác định đối xứng xác định, nhưng trong số học chính xác hữu hạn, bạn sẽ nhận được các giá trị riêng nhỏ với độ chính xác cao hơn nhiều.

Chỉnh sửa: Xem Demmel & Kahan, Các giá trị đơn lẻ chính xác của ma trận hai chiều, SIAM J. Sci. Thống kê Tính toán. 11 (1990), 873-912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

Chỉnh sửa2; Lưu ý rằng không có phương pháp nào có thể giải quyết các giá trị riêng nhỏ hơn khoảng thời gian định mức độ chính xác của máy được sử dụng, vì việc thay đổi một mục nhập bằng một ulp có thể đã thay đổi một giá trị riêng nhỏ bằng cách này. Do đó, việc lấy các giá trị riêng bằng 0 thay cho các giá trị rất nhỏ là phù hợp và không có phương pháp nào (ngoại trừ làm việc với độ chính xác cao hơn) sẽ loại bỏ các hàm riêng tương ứng, mà chỉ trả về một cơ sở cho không gian null số chung.


Tôi không chắc chắn tôi tin điều này, vì hầu hết các triển khai SVD đều bắt đầu bằng việc giảm đơn nhất thành dạng hai chiều thực và sau đó về cơ bản tính toán EVD của Hermiti của một ma trận liên quan, chẳng hạn như , có thể dễ dàng được hoán vị thành dạng tam giác đối xứng thực. Độ chính xác tương đối phụ thuộc nhiều vào phương pháp nào được sử dụng để giải quyết EVP / SVD cô đọng và tôi không thấy SVD có lợi thế ở đâu ... Tôi chắc chắn rằng điều này sẽ được thảo luận trong một hoặc nhiều bài báo của Demmel. [0,BT;B,0]
Jack Poulson

2
@JackPoulson: Điểm đáng chú ý là dạng hai chiều xác định các giá trị số ít nhỏ tốt hơn nhiều. Dạng tam giác đối xứng liên quan có các số 0 trên đường chéo, được bảo toàn bằng cách giảm hai chiều thành đường chéo, nhưng không được áp dụng bởi QR áp dụng cho đường chéo.
Arnold Neumaier

1
Tài liệu tham khảo? Phương pháp của Jacobi được biết là rất chính xác (mặc dù chậm).
Jack Poulson

@JackPoulson: Hãy thử và xem. Demmel & Kahan, Các giá trị đơn lẻ chính xác của ma trận hai chiều, 202,38.126,65/oldmirrors/ftp.netlib.org/lapack/lawnspdf/ trộm
Arnold Neumaier

Tôi thấy những gì bạn đang nhận được: thuật toán QR cho SVD hai chiều có thể được thực hiện tương đối chính xác vì đường chéo bằng 0 của hoán vịMa trận , trong khi kỹ thuật "zero-shift" này không hoạt động đối với các ma trận tam giác tùy ý, do đó EVP dựa trên thuật toán QR sẽ kém chính xác hơn đối với các giá trị riêng nhỏ. Điều đáng chú ý là lý do này giả định một eigensolver dựa trên việc sử dụng thuật toán QR trên dạng cô đọng; Jacobi là một ngoại lệ đáng chú ý, nhưng có lẽ nó chậm hơn so với SVD dựa trên thuật toán QR. MRRR đôi khi cũng có thể đạt được độ chính xác tương đối cao. [0,BT;B,0]
Jack Poulson

1

Cảm ơn bạn cho đề nghị này. Tôi đã thử lệnh SVD của Mathicala, nhưng tôi không nhận được sự cải thiện đáng chú ý nào (vẫn còn thiếu các đối xứng thích hợp, 'giá trị bản địa' không chính xác bằng 0 khi chúng không chính xác phát ra âm trước đó). Có lẽ tôi sẽ cần phải thực hiện một trong các thuật toán mà bạn mô tả ở trên thay vì hàm dựng sẵn? Tôi có lẽ muốn tránh gặp rắc rối khi sử dụng một phương pháp cụ thể như thế này trừ khi tôi chắc chắn trước rằng nó sẽ mang lại sự cải thiện đáng kể.

@JackPoulson, tôi đã đọc lướt qua bài viết về phương pháp của Jacobi mà bạn đã tham khảo, và nó có vẻ đầy hứa hẹn. Bạn có thể hoặc bất cứ ai đề xuất một cách tốt để thực hiện phương pháp của Jacobi để tìm hệ thống eigensystem không? Tôi đoán rằng nếu tôi tự mã hóa nó (trong MATLAB), nó sẽ cực kỳ chậm.


Tôi chưa thử nghiệm nó, nhưng có một triển khai MATLAB ở đây: Groups.google.com.vn/forum/?fromgroups#!msg/sci.math.num-analysis/
Jack Poulson

Lưu ý rằng không có phương pháp nào có thể giải quyết các giá trị riêng nhỏ hơn khoảng thời gian định mức độ chính xác của máy được sử dụng, vì việc thay đổi một mục nhập bằng một ulp có thể đã thay đổi một giá trị riêng nhỏ bằng cách này. Do đó, việc lấy các giá trị riêng bằng 0 thay cho các giá trị rất nhỏ là phù hợp và không có phương pháp nào (ngoại trừ làm việc với độ chính xác cao hơn) sẽ loại bỏ các hàm riêng tương ứng, mà chỉ trả về một cơ sở cho không gian null số chung. Bạn cần giá trị bản địa để làm gì?
Arnold Neumaier

@ArnoldNeumaier: Tôi đã chạy một số thử nghiệm trong MATLAB với các giá trị riêng trong phạm vi [0,1], với một giá trị riêng được đặt thủ công thành các giá trị như 6.3e-16 và thường trình SVD của Octave (dựa trên dgesvd, sử dụng tính năng giảm theo đường chéo và sau đó QR) nhận các giá trị này chính xác hơn nhiều so với eig của Octave. Mã Jacobi được liên kết dường như quá chậm để sử dụng, ngay cả trên các ma trận có kích thước khiêm tốn.
Jack Poulson

@JackPoulson: Vâng. Nhưng Leigh dường như phàn nàn về nhiều giá trị riêng rất nhỏ, và các hàm riêng của chúng sẽ hiếm khi được thiết kế mà sẽ trộn tự do, bất kể sử dụng phương pháp nào. Và giá trị dương rất nhỏ dương (nhỏ hơn 1e-16) tất nhiên sẽ được tìm thấy bằng không.
Arnold Neumaier

@ArnoldNeumaier đúng là tôi đang tìm thấy nhiều giá trị riêng rất nhỏ, mà tôi đoán là làm trầm trọng thêm vấn đề. Tôi đã không nhận ra (mặc dù nhìn lại nó là hiển nhiên) rằng giá trị bản địa nhỏ hơn 1e-16 sẽ bằng 0 trong dấu phẩy động. Tôi đoán mặc dù số lượng có thể được lưu trữ, lỗi làm tròn xảy ra khi thêm nó vào một số lớn hơn. Các eigenvector cho tôi biết nếu một vấn đề nhất định có thể giải quyết được. Trình xác định cho phép phân tách vấn đề thành các phần có thể giải được và không thể giải được. Nếu tôi bị giới hạn về cơ bản bởi độ chính xác, thì bạn có thể đề xuất bất kỳ gói nào cho giải pháp nhanh hơn không?
Leigh
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.