Скажем, я определяю большую квадратичную матрицу (например, 150x150). Один раз это массив с множеством (матрица 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
).
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))
Чтобы проверить, если оба обратные и B равны, я подведу различие в квадрате.
# 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, ошибка между numpy как scipy обратными функциями очень мала (приблизительно ~ + -10 ** - 32). Но мне нужна разреженная версия для больших матриц (например, 500x500).
Я делаю здесь что-то не так, или есть возможность исправить правильный , обратный к разреженной матрице в python?
Насколько велика относительная ошибка? –
Вы имеете в виду возможную относительную ошибку для моей проблемы или относительную ошибку между двумя матрицами? – PiMathCLanguage
Я имею в виду вычисленную ошибку, деленную на квадрат эвклидовой длины одного из двух инверсий, которые вы сравниваете. –