Крошечная числовая разница в сумме квадратов в зависимости от использованного вызова процедуры

Я пишу функцию, которая вычисляет сумму квадратов ошибок. x а также y являются векторами одинаковой длины; y это данные наблюдений, x это данные, рассчитанные по моей модели.

Код похож на:

>> res = y.ravel() - x.ravel()
>> np.dot(res.T, res)
>> 1026.7059479504269

>> np.sum(res**2)
>> 1026.7059479504273

Теперь посмотрим на последние две цифры. Может кто-нибудь сказать мне, что является причиной этого? Оба вызова должны привести к одним и тем же операциям. Кто-нибудь знает, откуда эта разница?

1 ответ

Добавление с плавающей точкой не является ассоциативным - порядок выполнения операций может повлиять на результат. предположительно np.dot(res, res) а также np.sum(res**2) выполнять операции в разных порядках.

Вот пример, где np.sum(x**2) != np.sum(x[:50]**2) + np.sum(x[50:]**2) (и ни один не равен np.dot(x, x)):

>>> np.random.seed(1234)
>>> x = np.random.randn(100)
>>> np.sum(x**2)
99.262119361371433
>>> np.sum(x[:50]**2) + np.sum(x[50:]**2)
99.262119361371461
>>> np.dot(x, x)
99.262119361371447
Другие вопросы по тегам