2017-12-02 27 views
0

미리 사과하십시오. 파이썬은 제 강점이 아닙니다.파이썬에 의해 계산 된 행렬의 고유 벡터는 고유 벡터로 보이지 않습니다.

이 행렬의 실제 고유 값에 해당하는 고유 벡터 (파이썬으로 계산 됨)는 고유 벡터로 보이지 않지만 Wolfram Alpha에서 계산 된 고유 벡터는 작동하는 것으로 보입니다. (. 내 동료는 내가 성적이없는 있지만, R에서 계산을 수행 할 때 같은 병리 사건을 것으로 보인다 확인) 코드 스 니펫을 다음 in_matrix 변수에 의해 evecs[2]를 곱하는 것은 새를 생산하고

>>> 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] 

주 벡터가 아닌 evecs[2] (eigenvector는 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] 

볼프람 (올바른)의 고유 벡터가 NumPy와 (sqrt(2), sqrt(2), 0)을 제공하는 반면, 음의 Y 축에 해당한다.

결론 : numpy의 고유 벡터는 고유 벡터가 아니지만 Wolfram Alpha 고유 벡터는 정확합니다. 누구든지 이것에 어떤 빛을 비춰 줄 수 있습니까?

이것은 Mac OS X에서 Python 2.7.10의 표준 설치와 Centos 6.8에서 Python 2.7.8의 사용자 정의 설치에서 테스트되었습니다.

+0

행과 열을 올바르게보고 있습니까? ('evecs [2]'의 값은 열이 아닌 행처럼 보입니다.) –

+0

맞아, 맞았 어. Docs를 올바르게 읽지 못하는 조합과 저는 보통 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]) 

당신은 볼프람 벡터와 동일한 것을 인식 할 수 있습니다. 3 개의 모든 고유 벡터는 정확합니다 :

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