2012-01-06 37 views
9

Các giá trị riêng của ma trận hiệp phương sai phải là thực và không âm bởi vì ma trận hiệp phương sai đối xứng và bán xác định dương.scipy.linalg.eig trả về giá trị riêng biệt phức tạp cho ma trận hiệp phương sai?

Tuy nhiên, hãy nhìn vào các thí nghiệm sau đây với scipy:

>>> a=np.random.random(5) 
>>> b=np.random.random(5) 
>>> ab = np.vstack((a,b)).T 
>>> C=np.cov(ab) 
>>> eig(C) 
7.90174997e-01 +0.00000000e+00j, 
2.38344473e-17 +6.15983679e-17j, 
2.38344473e-17 -6.15983679e-17j, 
-1.76100435e-17 +0.00000000e+00j, 
5.42658040e-33 +0.00000000e+00j 

Tuy nhiên, tái tạo ví dụ trên trong Matlab hoạt động chính xác:

a = [0.6271, 0.4314, 0.3453, 0.8073, 0.9739] 
b = [0.1924, 0.3680, 0.0568, 0.1831, 0.0176] 
C=cov([a;b]) 
eig(C) 
-0.0000 
-0.0000 
0.0000 
0.0000 
0.7902 

Trả lời

20

Bạn đã tăng hai vấn đề:

  1. Các giá trị riêng được trả về bởi scipy.linalg.eig là không có thật.
  2. Một số giá trị riêng là số âm.

Cả hai vấn đề này là kết quả của lỗi được giới thiệu bởi lỗi cắt ngắn và làm tròn, luôn xảy ra với thuật toán lặp sử dụng số học dấu phẩy động. Lưu ý rằng kết quả Matlab cũng tạo ra các giá trị riêng.

Bây giờ, đối với một khía cạnh thú vị hơn của vấn đề: tại sao kết quả của Matlab thực, trong khi kết quả của SciPy có một số thành phần phức tạp?

Matlab's eig phát hiện xem ma trận đầu vào có đối xứng thực hay Hermitian và sử dụng hệ số Cholesky khi có. Xem mô tả của đối số chol trong eig documentation. Điều này không được thực hiện tự động trong SciPy.

Nếu bạn muốn sử dụng thuật toán khai thác cấu trúc của ma trận đối xứng hoặc Hermitian thực, hãy sử dụng scipy.linalg.eigh. Đối với ví dụ trong câu hỏi:

>>> eigh(C, eigvals_only=True) 
array([ -3.73825923e-17, -1.60154836e-17, 8.11704449e-19, 
     3.65055777e-17, 7.90175615e-01]) 

Kết quả này giống như Matlab, nếu bạn làm tròn cùng một số chữ số chính xác mà Matlab đã in.

3

gì bạn đang gặp bất ổn số là do hạn chế về độ chính xác của dấu phẩy động.

Lưu ý rằng:

(1) MATLAB cũng trở giá trị âm, nhưng các định dạng in ấn được thiết lập để short và bạn không thấy sự chính xác đầy đủ của lưu trữ trong bộ nhớ kép. Sử dụng format long g để in thêm số thập phân

(2) Tất cả các phần ảo được trả về bởi lumpg.eig của numpy gần với độ chính xác của máy. Vì vậy, bạn nên xem xét chúng bằng không.

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