큰 이차 행렬을 정의한다고 가정 해 보겠습니다 (예 : 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.inv
및 spsolve
)를 계산하는 두 가지 방법을 사용합니다. 및 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).
나는 여기에 뭔가 잘못하고있는 것일까? 또는 파이썬에서 희소 행렬의 역함수 인 을 역으로 계산할 가능성이 있습니까??
상대 오차는 얼마나 큽니까? –
내 문제의 가능한 상대 오류 또는 두 행렬 간의 상대 오류를 의미합니까? – PiMathCLanguage
귀하가 계산 한 오류를 비교 한 두 가지 반전 중 하나의 유클리드 거리의 제곱으로 나눈 것입니다. –