2017-12-02 473 views
0

事先道歉,Python不是我的強項。由Python計算的矩陣的特徵向量似乎不是一個特徵向量

與矩陣的實際特徵值(如Python計算)相對應的特徵向量看起來不是特徵向量,而由Wolfram Alpha計算的特徵向量似乎可行。 (我的同事證實,同一病理執行R中的計算時,雖然我沒有成績單似乎是這樣。)代碼片段:

>>> import numpy as np 
>>> in_matrix = np.array([[0.904, 0.012, 0.427], [-0.0032, 0.99975, -0.02207], [-0.4271, 0.0186, 0.904]]) 
>>> evals, evecs = np.linalg.eig(in_matrix) 
>>> print evals 
[ 0.90388357+0.42760138j 0.90388357-0.42760138j 0.99998285+0.j] 
>>> print evecs[2] 
[ 0.70696571+0.j 0.70696571-0.j 0.01741090+0.j] 
>>> print in_matrix.dot(evecs[2]) 
[ 0.65501505+0.j 0.70414242+0.j -0.27305604+0.j] 

注意,由in_matrix變量乘以evecs[2]產生新向量不是evecs[2](特徵向量應該是1)。

將相同的矩陣插入Wolfram Alpha會產生真實特徵值的特徵向量(-0.0474067, -0.998724, 0.0174109)。按照預期,該特徵向量乘以in_matrix確實產生相同的向量。

>>> wolfram_vec = np.array([-0.0474067, -0.998724, 0.0174109]) 
>>> print in_matrix.dot(wolfram_vec) 
[-0.04740589 -0.99870688 0.01741059] 

的鎢(正確的)本徵向量對應於負Y軸,而numpy的給出(sqrt(2), sqrt(2), 0)。底線:numpy的特徵向量不是特徵向量,但Wolfram Alpha特徵向量是正確的(並且看起來是這樣的)。任何人都可以解釋這一點嗎?

這已經在Mac OS X上的Python 2.7.10的標準安裝和CentOS 6.8上的Python 2.7.8的自定義安裝上進行了測試。

+0

你確定你正在查看行vs列嗎? ('evecs [2]'中的值看起來像是一排,而不是一列。) –

+0

你說得對,就是這樣。不正確閱讀文檔的組合,我通常不會讀/寫Python。謝謝! – helen

回答

1

引用文檔:

v : (..., M, M) array 
    The normalized (unit "length") eigenvectors, such that the 
    column ``v[:,i]`` is the eigenvector corresponding to the 
    eigenvalue ``w[i]``. 

你需要提取的列,evecs[:, i],而不是行,evecs[i]

In [30]: evecs[:, 2] 
Out[30]: array([-0.04740673+0.j, -0.99872392+0.j, 0.01741090+0.j]) 

您可能會認出它與Wolfram矢量相同。所有三個特徵向量都是正確的:

In [31]: in_matrix.dot(evecs[:, 0]) - evals[0] * evecs[:, 0] 
Out[31]: 
array([ 5.55111512e-17 +1.11022302e-16j, 
     -7.11236625e-17 +1.38777878e-17j, 2.22044605e-16 -1.66533454e-16j]) 

In [32]: in_matrix.dot(evecs[:, 1]) - evals[1] * evecs[:, 1] 
Out[32]: 
array([ 5.55111512e-17 -1.11022302e-16j, 
     -7.11236625e-17 -1.38777878e-17j, 2.22044605e-16 +1.66533454e-16j]) 

In [33]: in_matrix.dot(evecs[:, 2]) - evals[2] * evecs[:, 2] 
Out[33]: array([ 3.46944695e-17+0.j, 4.44089210e-16+0.j, 3.15719673e-16+0.j]) 

其中每個結果[0,0,0]在預期精度內。

+0

謝謝,就是這樣!很簡單! – helen

相關問題