2016-11-15 50 views
6

현재 작업으로 120 * 120 매트릭스의 고유 값과 고유 벡터를 계산해야합니다. 처음에는 Java (Apache Commons Math 라이브러리)와 Python 2.7 (Numpy 라이브러리)에서 간단한 2 x 2 행렬로 계산을 테스트했습니다. I는, 고유 값과 일치하지 않는 문제가 아래와 같이 표시 :자바와 파이썬으로 고유 벡터 계산시 차이점

고유 벡터의 출력 {real_value + imaginary_value로서 도시
//Java 
import org.apache.commons.math3.linear.EigenDecomposition; 
import org.apache.commons.math3.linear.MatrixUtils; 
import org.apache.commons.math3.linear.RealMatrix; 

public class TemporaryTest { 

    public static void main(String[] args) { 

    double[][] testArray = {{2, -1}, {1, 1}}; 
    RealMatrix testMatrix = MatrixUtils.createRealMatrix(testArray); 
    EigenDecomposition decomposition = new EigenDecomposition (testMatrix); 
    System.out.println("eigenvector[0] = " + decomposition.getEigenvector(0)); 
    System.out.println("eigenvector[1] = " + decomposition.getEigenvector(1)); 
} 

; real_value + imaginary_value} : 파이썬에서

//Java output 
eigenvector[0] = {-0.8660254038; 0} 
eigenvector[1] = {0.5; 1} 

같은 코드 만 사용 NumPy와 라이브러리 : 유사하게 표시됩니다 파이썬에서 고유 벡터의

# Python 
import numpy as np 
from numpy import linalg as LA 

w, v = LA.eig(np.array([[2, -1], [1, 1]])) 
print (v[:, 0]) 
print (v[:, 1]) 

출력, [실제 +의 IMAG 리얼 + IMAG] :

[ 0.35355339+0.61237244j 0.70710678+0.j  ] 
[ 0.35355339-0.61237244j 0.70710678-0.j  ] 

내 관심사는 왜 그 벡터가 다른가요? 제가 누락 된 것이 있습니까? Ty 어떤 종류의 도움이나 조언이든지

+1

자바 출력의 벡터는 고유 벡터가 아닙니다. 'getEigenvector (i)'는'RealVector'를 반환하지만 여러분의 행렬은 복잡한 고유 값과 고유 벡터를 가지고 있습니다. 아파치 커먼즈 수학 라이브러리가 복잡한 고유 벡터를 어떻게 표현하는지 모르겠습니다. 라이브러리에 익숙한 누군가는 자바 함수에서 반환 된 실제 값을 실제 복잡한 고유 벡터로 변환하는 데 도움이되기를 바랍니다. –

+0

나는 동의하지만 알 수 있듯이 실제 값조차 일치하지 않습니다. -/ – borgmater

+0

자바는 정규화되지 않았습니다. – user3684792

답변

1

, EigenDecomposition는 비대칭 행렬을 허용하지만, 클래스 RealVectorRealMatrix를 사용하여 결과를 반환합니다. 실제 복잡한 결과를 얻으려면 적절한 실제 결과를 복소 공액 쌍으로 결합해야합니다. 고유 벡터의 경우

, 당신이있어 :

eigenvector[0] = {-0.8660254038; 0} 
eigenvector[1] = {0.5; 1} 

그 두 벡터는 고유 getRealEigenvalue(0) + getImagEigenvalue(0)*igetRealEigenvalue(1) + getImagEigenvalue(1)*i의 복소 공액 쌍과 관련되어 있지만 그 벡터는 실제 고유 벡터는 없습니다. 실제 고유 벡터는 복소 콘쥬 게이트 쌍 eigenvector[0] + eigenvector[1]*ieigenvector[0] - eigenvector[1]*i입니다.

이러한 벡터는 여전히 numpy에서 반환 된 결과와 "일치하지"않지만 이는 두 라이브러리가 동일한 정규화를 사용하지 않았기 때문입니다. 고유 벡터는 고유하지 않습니다. 0이 아닌 스칼라 (복소 스칼라 포함)가 곱해진 고유 벡터는 여전히 고유 벡터입니다. Java 결과와 numpy 결과의 유일한 차이점은 스칼라 승수입니다.

편의상 부동 소수점 값을 정확한 값으로 변환합니다. 즉, -0.8660254038-sqrt(3)/2의 부동 소수점 근사입니다.자바 수학 라이브러리는 다음과 같은 고유 벡터를주고있다 :

[-sqrt(3)/2 + (1/2)*i] and [-sqrt(3)/2 - (1/2)*i] 
[  0 +  1*i]   [  0 -  1*i] 

당신이에 의해 최초의 고유 벡터를 곱하면 - (SQRT (2)/2) 및에 의해 두 번째 * (SQRT (2)/2) * 내가, 당신은 numpy에 의해 돌아온 고유 벡터를 얻을 것이다.

여기 계산과 함께 ipython 세션이 있습니다. v1v2은 위에 표시된 벡터입니다.

In [20]: v1 = np.array([-np.sqrt(3)/2 + 0.5j, 1j]) 

In [21]: v1 
Out[21]: array([-0.8660254+0.5j, 0.0000000+1.j ]) 

In [22]: v2 = np.array([-np.sqrt(3)/2 - 0.5j, -1j]) 

In [23]: v2 
Out[23]: array([-0.8660254-0.5j, 0.0000000-1.j ]) 

곱하기 v1는로 - (SQRT (2)/2) * I는 제 고유 벡터 numpy.linalg.eig 의해 반환하세요 :

In [24]: v1*(-np.sqrt(2)/2*1j) 
Out[24]: array([ 0.35355339+0.61237244j, 0.70710678-0.j  ]) 

곱하기 v2 그래피 (SQRT (2)/2) * I numpy.linalg.eig에 의해 반환되는 두 번째 고유 벡터 얻을 : 편의를 위해

In [25]: v2*(np.sqrt(2)/2*1j) 
Out[25]: array([ 0.35355339-0.61237244j, 0.70710678+0.j  ]) 

을, 여기에 NumPy와 계산의 반복이다. evecs의 열이 고유 벡터입니다.

In [28]: evals, evecs = np.linalg.eig(a) 

In [29]: evecs 
Out[29]: 
array([[ 0.35355339+0.61237244j, 0.35355339-0.61237244j], 
     [ 0.70710678+0.j  , 0.70710678-0.j  ]]) 
+0

먼저, 당신의 상세한 답변에 대해 정말 고마워요. 둘째, 나는이 단계를 한 걸음 내딛어도 괜찮 으면 좋겠다. 그래서 나는 모든 것을 이해할 수있다. 내 현재 질문은 - eigenvector [0] 및 eigenvector [1]에 두 개의 항목 (예 : -0.8660254038; 0)이있는 경우 두 번째 항목 (0)을 어디에서 사용합니까? "-i"(대답에서, 부동 소수점을 변환 한 후)? 오후 8시 30 분 P.S. 또한 {{2, -2}, {1, 1}}로 다른 예제를 실행했는데 프로 시저를 따르면 올바른 값을 얻을 수 없습니다. ( – borgmater

+0

* "... 어디서 두 번째 항목을 사용합니까? "* eigenvector [0] [1]'이 0이기 때문에 실제 고유 벡터의 두 번째 항목은 모두 순수한 허수이고 실수 부분은 0입니다."0 + ... "을 포함하는 고유 벡터의 ASCII 표현을 편집했습니다. "0은 'eigenvector [0] [1]'입니다. –

+0

*"... 다음 프로 시저에 따라 올바른 값을 얻을 수 없습니다 "* 동일한 상수 (± sqrt (2)/2)를 다음과 같이 사용할 수 없습니다. 각 고유 벡터 (더 정확하게, [* 단순 * 고유 값] (https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#Algebraic_multiplicity)와 연관된 각 고유 벡터에 대해) * some * 상수가있을 것입니다. 자바 결과를 numpy 결과에 매핑하는 데 사용할 수 있습니다. –

1

나는 당신이 일하게 할 수 없을 것이라고 생각합니다.

(고유 포함한 복잡한 숫자에 의해 그래서 아무 곱셈),이 클래스는 만 지원 : 이유는 여기에있다 대칭 행렬이므로 실제 realEigenvalues ​​만 계산합니다. 이것은 getD()에 의해 반환 된 D 행렬이 항상 대각선이며 getImagEigenvalue (int) 및 getImagEigenvalues ​​()가 항상 null 인 상수 값이 반환된다는 것을 의미합니다. (다) 아파치 코 몬즈 수학 3에서 EigenDecomposition JavaDoc