Вы правы, что все 3 версии должны вычислять один и тот же результат.Могут быть некоторые различия, поскольку арифметика с плавающей точкой не является ни ассоциативной, ни дистрибутивной:
In [147]: ((0.1+0.2)+0.3) != (0.1+(0.2+0.3))
Out[147]: True
In [153]: 0.3*(0.1+0.2) != 0.3*0.1 + 0.3*0.2
Out[153]: True
Соедините это с умножением на большое число:
In [164]: 1e15 * ((0.1+0.2)+0.3) - 1e15 * (0.1+(0.2+0.3))
Out[164]: 0.125
, и расхождение может стать значительным.
Но в типичном случае ваш код работает должным образом:
import numpy as np
import scipy.sparse as sparse
# np.random.seed(2019)
K, M, N, P = 100, 200, 300, 400
AT = sparse.random(K, M, density=0.001, format='csc')
y_k = sparse.random(M, P, density=0.001, format='csc')
t_k = np.exp(1)
AHAT_inv = sparse.random(M, N, density=0.001, format='csc')
b = sparse.random(N, P, density=0.0001, format='csc')
c = sparse.random(K, P, density=0.001, format='csc')
s_k_control = c - (AT.dot(y_k) + AT.dot(t_k * (AHAT_inv.dot(b))))
print("SK_control 1:", s_k_control.min())
s_k_control = c - AT.dot(y_k + (t_k * (AHAT_inv.dot(b))))
print("SK_control 2:", s_k_control.min())
y_k_1 = y_k + t_k * (AHAT_inv.dot(b))
s_k_control = c - AT.dot(y_k_1)
print("SK_control 3:", s_k_control.min())
печатает такой результат, как
SK_control 1: -0.6701900742964602
SK_control 2: -0.6701900742964602
SK_control 3: -0.6701900742964602
Для дальнейшего изучения вашей ситуации это будетБудьте очень полезны, если вы можете создать работоспособный воспроизводимый пример, демонстрирующий несоответствие.
Обратите внимание, что в документах есть предупреждение *1019*, что настоятельно не рекомендует применение функций NumPy непосредственно к разреженным матрицам: «, поскольку NumPy может неправильно преобразовывать их для вычислений, что приводит к неожиданным (и неправильным) результатам ».Вместо этого используйте методы разреженной матрицы.Поэтому вместо np.min(s_k_control)
используйте s_k_control.min()
.
Если недоступно, и вы не можете придумать другой метод, рекомендуется преобразовать разреженную матрицу в массив NumPy перед применением любого NumPy.функция.
Эта проблема, по-видимому, не является причиной проблемы в вашем случае, но об этом нужно знать.