【问题标题】:Dot Product: * Command vs. Loop gives different results点积:* 命令与循环给出不同的结果
【发布时间】:2013-04-24 20:12:33
【问题描述】:

我在 Matlab 中有两个向量,zbeta。矢量z 是 1x17:

1 0.430742139435890 0.257372971229541 0.0965909090909091 0.694329541928697 0 0.394960106863064 0 0.100000000000000 1 0.264704325268675 0.387774594078319 0.269207605609567 0.472226643323253 0.750000000000000 0.513121013402805 0.697062571025173

... 和 beta 是 17x1:

6.55269487769363e+26 0 0 -56.3867588816768 -2.21310778926413 0 57.0726052009847 0 3.47223691057151e+27 -1.00249317882651e+27 3.38202232046686 1.16425987969027 0.229504956512063 -0.314243264212449 -0.257394312588330 0.498644243389556 -0.852510642195370

我正在处理一些奇点问题,我注意到如果我想计算 z*beta 的点积,我可能会得到 2 个不同的解决方案。如果我使用* 命令,z*beta = 18.5045。如果我编写一个循环来计算点积(如下),我会得到 0.7287 的解。

summation=0;
for i=1:17
    addition=z(1,i)*beta(i);
    summation=summation+addition;
end

知道这里发生了什么吗?

这是数据的链接:https://dl.dropboxusercontent.com/u/16594701/data.zip

【问题讨论】:

  • 你也可以只使用matlab函数“dot”来计算点积
  • @Amy:我已经用你的方法和下面发布的方法 natan(在 R2012a 上)计算了这一点,他们三个都给了4.1232e+12
  • @zplesivcak:变量的缩放可能是问题的一部分,所以我给出的截断数据并没有显示问题。我添加了指向数据的链接。我也在使用 R2012a。
  • 如果你真的很在意精确的结果,也许可以尝试使用一些任意精度的Matlab库;一个是here
  • @zplesivcak:精度不是那么重要,只是一致性。我正在构建一个回归模型......计算的输出重新统计很小(例如:0.7287),但是当我使用 regstats 中的 beta 值手动计算输出时,我得到更大的值(例如:18.5045)。我正在使用残差(来自 regstats)来训练另一个模型,所以我需要这些残差与回归模型实际预测的结果一致(z*beta)。

标签: matlab floating-point floating-accuracy dot-product


【解决方案1】:

这里的问题是浮点数的加法不是关联的。当对一系列相当数量的数字求和时,这通常不是问题。但是,在您的序列中,大多数数字都在 1 或 10 左右,而几个条目的大小为 10^26 或 10^27。在这种情况下,数值问题几乎是不可避免的。

维基百科页面http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems 显示了一个工作示例,其中(a + b) + c 不等于a + (b + c),即证明浮点数相加的顺序很重要。

我猜这是一项旨在说明这些确切问题的家庭作业。如果不是,我会询问数据代表什么以找出适当的方法。首先找出为什么会产生如此大的数字可能比试图理解包含它们的点积更有效率。

【讨论】:

  • 我正在尝试建立一个回归模型作为我研究的一部分。测试版中的大量条目是由此产生的结果。我现在知道该模型不适合,但我惊讶地发现基本相同的计算结果不同。
  • 我建议在您到达点积之前出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多