2012-08-30 4 views
0

numpy linalg.eig 알고리즘의 아주 이상한 동작을 발견했습니다. python/numpy : numpy가있는 문제 linal.eig

>>> import numpy as np 
>>> a = np.array([[1., 0., 0., 0., 0., 0., 0., 0.], 
... [0., -1., -0.5, 0., -0.5, 0., 0., 0.], 
... [0., -0.5, 0., 0., 0., 0., 0., 0.], 
... [0., 0., 0., 0., 0., 0., -0.5, 0.], 
... [0., -0.5, 0., 0., 0., 0., 0., 0.], 
... [0., 0., 0., 0., 0., 0., -0.5, 0.], 
... [0., 0., 0., -0.5, 0., -0.5, -1., 0.], 
... [0., 0., 0., 0., 0., 0., 0., 1.]]) 
>>> np.linalg.eig(a) 
(array([-1.366, 0.366, -1.366, 0.366, 0. , 0. , 1. , 1. ]), 
array([[ 0. , 0. , 0. , 0. , 0. , 0. , 1. , 0. ], 
    [-0. , 0. , -0.822, 0.426, 0. , 0. , 0. , 0. ], 
    [ 0. , 0. , -0.301, -0.581, 0.13 , 0. , 0. , 0. ], 
    [-0.325, -0.628, -0.123, -0.237, -0.695, -0.707, 0. , 0. ], 
    [ 0. , 0. , -0.301, -0.581, -0.13 , -0. , 0. , 0. ], 
    [-0.325, -0.628, -0.123, -0.237, 0.695, 0.707, 0. , 0. ], 
    [-0.888, 0.46 , -0.336, 0.174, -0. , -0. , 0. , 0. ], 
    [ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 1. ]])) 

내가 위 (열의) 잘못된 고유 벡터를 얻을 수

을 실행하면

.

정답은

>>> np.linalg.eigh(a) 
(array([-1.366, -1.366, -0. , 0. , 0.366, 0.366, 1. , 1. ]), 
array([[-0. , 0. , 0. , 0. , 0. , -0. , 1. , 0. ], 
    [-0. , -0.888, 0. , 0. , 0. , -0.46 , 0. , 0. ], 
    [-0. , -0.325, 0. , -0.707, 0. , 0.628, 0. , 0. ], 
    [-0.325, 0. , -0.707, 0. , -0.628, -0. , 0. , 0. ], 
    [ 0. , -0.325, 0. , 0.707, 0. , 0.628, 0. , 0. ], 
    [-0.325, 0. , 0.707, 0. , -0.628, -0. , 0. , 0. ], 
    [-0.888, 0. , 0. , 0. , 0.46 , -0. , 0. , 0. ], 
    [-0. , 0. , 0. , 0. , 0. , -0. , 0. , 1. ]])) 

나는 EIG 알고리즘은 간단한 행렬을 대각 수없는 정말 놀랐어요 주어진다!

이 동작을보고해야합니까? 여기에 표시된

편집

NumPy와 버전 1.6.2

답변

1

모든 결과는 정확합니다.

행렬에는 고유 값이 -1.366과 0.366 인 두 개의 2D 부분 공간이 있기 때문에. 2D 부분 공간의 경우 선형 독립 고유 벡터의 여러 선형 조합을 선택할 수 있습니다.

+0

당신의 대답은 원칙적으로 올바른 생산하지만, 당신이 그 고유 벡터 사이의 내적을 할 경우는 직교하지 않는 것을 발견! '>>> evals, evecs = np.linalg.eig (a)'' >>> np.dot (evecs [2] evecs [3])'' 0.084518196456252692' – Pie86

+0

는 Pie86 @ 답은 사실적이다 옳은. 다중 고유 값을 가질 때 직교 독립 벡터가 아닌 선형 독립 벡터를 제공하면됩니다. –

+0

선형 고유 독립 공간에 속한 고유 벡터는 (첫 번째 설명의 경우와 같이 다른 고유 값에 해당) 직각이어야한다고 생각합니다 ... 틀린가요? – Pie86

1

모든 것이 나에게 잘 보이는 :

import numpy as np 

a = np.array([[1., 0., 0., 0., 0., 0., 0., 0.], 
       [0., -1., -0.5, 0., -0.5, 0., 0., 0.], 
       [0., -0.5, 0., 0., 0., 0., 0., 0.], 
       [0., 0., 0., 0., 0., 0., -0.5, 0.], 
       [0., -0.5, 0., 0., 0., 0., 0., 0.], 
       [0., 0., 0., 0., 0., 0., -0.5, 0.], 
       [0., 0., 0., -0.5, 0., -0.5, -1., 0.], 
       [0., 0., 0., 0., 0., 0., 0., 1.]]) 

fns = np.linalg.eig, np.linalg.eigh 
for fn in fns: 
    print fn 
    ww, vv = fn(a) 
    for i in range(len(ww)): 
     w = ww[i] 
     v = vv[:,i] 
     print i, np.allclose(np.dot(a, v),w*v), 
    print 

<function eig at 0xb5b570d4> 
0 True 1 True 2 True 3 True 4 True 5 True 6 True 7 True 
<function eigh at 0xb5b5710c> 
0 True 1 True 2 True 3 True 4 True 5 True 6 True 7 True