2017-02-06 4 views
3

큰 이차 행렬을 정의한다고 가정 해 보겠습니다 (예 : 150x150). 한 번 numpy 배열 (행렬 A), scipy 스파 스 배열 (행렬 B)입니다.numpy 및 scipy의 행렬 반전 함수가 큰 이차 행렬을 사용하여 다른 결과를 반환하는 이유는 무엇입니까?

import numpy as np 
import scipy as sp 

from scipy.sparse.linalg import spsolve 

size = 150 
A = np.zeros((size, size)) 
length = 1000 
# Set some random numbers at random places 
A[np.random.randint(0, size, (2, length)).tolist()] = \ 
    np.random.randint(0, size, (length,)) 
B = sp.sparse.csc_matrix(A) 

이제 두 행렬의 역수를 계산합니다. 행렬 B에 대해 역함수 (sp.sparse.linalg.invspsolve)를 계산하는 두 가지 방법을 사용합니다. B 모두 역수가 동일한 경우

epsilon = 10.**-8 # Is needed to prevent singularity of each matrix 

inv_A = np.linalg.pinv(A+np.eye(size)*epsilon) 
inv_B = sp.sparse.linalg.inv(B+sp.sparse.identity(size)*epsilon) 
inv_B2 = spsolve(B+sp.sparse.identity(size)*epsilon, sp.sparse.identity(size)) 

는 확인하려면 나는 차이의 제곱 요약됩니다.

# Is not equal zero, question: Why? 
# Sometimes very small (~+-10**-27), sometimes very big (~+-10**5) 
print("np.sum((inv_A - inv_B)**2): {}".format(np.sum((inv_A - inv_B)**2))) 
# Should be zero 
print("np.sum((inv_B - inv_B2)**2): {}".format(np.sum((inv_B - inv_B2)**2))) 

문제는 다음과 같습니다. 예 : 작은 행렬을 사용하는 경우. 10x10이면 scipy 역함수와 같은 numpy의 오차는 매우 작습니다 (약 ~ + -10 ** - 32). 하지만 큰 행렬에 대해서는 희소 버전이 필요합니다 (예 : 500x500).

나는 여기에 뭔가 잘못하고있는 것일까? 또는 파이썬에서 희소 행렬의 역함수 인 을 역으로 계산할 가능성이 있습니까??

+1

상대 오차는 얼마나 큽니까? –

+0

내 문제의 가능한 상대 오류 또는 두 행렬 간의 상대 오류를 의미합니까? – PiMathCLanguage

+0

귀하가 계산 한 오류를 비교 한 두 가지 반전 중 하나의 유클리드 거리의 제곱으로 나눈 것입니다. –

답변

2

제목 질문에 대한 답은 다음과 같습니다. 불행히도 예제 매트릭스를 선택했기 때문입니다. 내가 정교하게 하렴.

기계 정밀도가 제한되어 부동 소수점 연산이 거의 100 % 정확하지 않습니다. 그냥 시도하십시오

>>> np.linspace(0, 0.9, 10)[1:] == np.linspace(0.1, 1, 10)[:-1] 
array([ True, True, True, True, True, False, True, True, True], dtype=bool) 

일반적으로 오류는 통지하기에 너무 작기 때문에 문제가되지 않습니다.

그러나 많은 계산의 경우 처리하기 어려운 입력이 있으며 수치 알고리즘을 과장 할 수 있습니다. 이것은 역변환에 확실히 적용되며, 어려운 입력을 선택하기에 불충분했습니다.

행렬의 특이 값을 살펴보면 행렬이 '부실 조건'인지 여부를 실제로 확인할 수 있습니다 (예 : here). 여기에 매트릭스 조건 번호는 스크립트로 생성 된 여러 행렬위한 것입니다 (size=200, 잘 행동 매트릭스 1에 훨씬 더 가까이 값이) 결과가 크게 개선 될 전망이다 잘 행동 행렬로 전환

971899214237.0 
5.0134186641e+12 
36848.0807109 
958492416768.0 
1.66615247737e+16 
1.42435766189e+12 
1954.62614384 
2.35259324603e+12 
5.58292606978e+12 

합니다.