2015-05-29 101 views
2

我在写一个计算错误平方和的函数。 xy是相同长度的向量; y是观测数据,x是我的模型计算的数据。取决于使用的numpy过程调用的微小的平方和的数值差异

的代码是这样的:

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

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

现在看最后两位数字。谁能告诉我这是什么原因?这两个调用应该导致相同的操作。有谁知道这种差异来自哪里?

+0

我只是想这是有关舍入的值。所以没什么可担心的。 –

+0

也许:http://stackoverflow.com/q/588004/3001761 – jonrsharpe

+1

如果我猜测,我会说这是'.dot'函数的工作方式,虽然它有相同的结果,但会计算点积在飞行中,而不是首先将所有数字平方,然后将它们加在一起。虽然对于你所处理的数字来说是相当无关紧要的,但我认为'.dot'比'np.sum(res ** 2)'更准确' – Matthew

回答

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