2012-06-18 19 views
15

scipy và NumPy có giữa chúng ba chức năng khác nhau cho việc tìm kiếm vector riêng cho một ma trận vuông được đưa ra, đó là:vector riêng Python: sự khác biệt giữa các numpy.linalg, scipy.linalg và scipy.sparse.linalg

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a), và
  3. scipy.sparse.linalg.eig(A, k)

Tập trung cụ thể về tình hình mà tất cả các đối số tùy chọn I'v e rời đi cuối cùng hai được trái tại mặc định của họ và rằng a/A là giá trị thực, tôi tò mò về sự khác nhau giữa ba đó là mơ hồ từ tài liệu - đặc biệt:

  • Tại sao (3) có một lưu ý rằng nó không thể tìm thấy tất cả eigenvectors?
  • Tại sao phải hai cách khác tính tất cả các giải pháp - tại sao họ không tham số k?
  • (1) có một lưu ý rằng các giá trị riêng được trả về không theo thứ tự cụ thể; (3) có một đối số tùy chọn để kiểm soát thứ tự. Liệu (2) có đảm bảo về điều này không?
  • Có (3) giả định rằng A là thưa thớt không? (toán học nói, thay vì được đại diện như một ma trận thưa thớt scipy) Nó có thể không hiệu quả, hoặc thậm chí cho kết quả sai, nếu giả định này không giữ?
  • Có những yếu tố nào khác mà tôi nên cân nhắc khi chọn trong số này không?

Trả lời

12

Hành vi đặc biệt của hành động thứ ba phải thực hiện với Lanczos algorithm, hoạt động rất tốt với ma trận thưa thớt. Các tài liệu của scipy.sparse.linalg.eig nói rằng nó sử dụng một wrapper cho ARPACK, mà lần lượt sử dụng "Implicitly Restarted Arnoldi Method (IRAM) hoặc, trong trường hợp ma trận đối xứng, biến thể tương ứng của thuật toán Lanczos." (1).

Bây giờ, các thuật toán Lanczos có tính chất mà nó hoạt động tốt hơn cho giá trị riêng lớn (trên thực tế, nó sử dụng eigenvalue tối đa):

Trong thực tế, thuật toán đơn giản này không làm việc rất tốt cho máy tính rất nhiều các eigenvectors bởi vì bất kỳ lỗi round-off sẽ có xu hướng giới thiệu các thành phần nhẹ của các chi tiết quan trọng hơn eigenvectors trở lại vào tính toán, làm suy giảm tính chính xác của tính toán. (2)

Vì vậy, trong khi các thuật toán Lanczos được chỉ là một xấp xỉ, tôi đoán hai phương pháp khác sử dụng algos để tìm chính xác giá trị riêng - và dường như tất cả trong số họ, mà có lẽ phụ thuộc vào các thuật toán được sử dụng, quá .

6

Dưới đây là một câu trả lời một phần cụ thể không thường xuyên của câu hỏi của bạn:

Về nguyên tắc, thói quen NumPy và scipy linalg() nên giống nhau. Cả hai đều sử dụng LAPACK và BLAS trong nội bộ. Việc thực hiện trong `´scipy.sparse`` sử dụng một thuật toán cụ thể hoạt động tốt cho các ma trận thưa thớt (ví dụ: một ma trận với hầu hết các mục nhập 0).Không sử dụng điều này nếu ma trận của bạn dày đặc.

Lưu ý rằng về mặt kỹ thuật, eig() trong SciPy/NumPy là các triển khai khác nhau do thực tế là cả hai gói đều có thể được xây dựng với các triển khai Lapack/BLAS khác nhau. Các lựa chọn phổ biến ở đây sẽ là Lapack/BLAS chuẩn có sẵn từ netlib, ATLAS, Intel MKL hoặc OpenBLAS.

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