2013-05-07 92 views
1

我需要对包含'n'独立变量和因变量的数据执行线性插值。我目前使用scipy.interpolate.LinearNDInterpolator来执行插值。但是,当通过将(变量的)所有值与常数相乘来更改数据集的范围时,插值后的结果完全改变。scipy结果线性插值结果不一致

让我说明这一个具体的例子:

X = [[0.00000000e+00, 1.00000000e+00], [0.00000000e+00, 8.00000000e+00], [0.00000000e+00, 1.60000000e+01], [0.00000000e+00, 3.20000000e+01], 
     [0.00000000e+00, 6.40000000e+01], [0.00000000e+00, 1.28000000e+02], [1.00000000e-06, 1.00000000e+00], [1.00000000e-06, 8.00000000e+00], 
     [1.00000000e-06, 1.60000000e+01], [1.00000000e-06, 3.20000000e+01], [1.00000000e-06, 6.40000000e+01], [1.00000000e-06, 1.28000000e+02], 
     [1.00000000e-06, 2.56000000e+02], [1.00000000e-06, 5.12000000e+02], [1.00000000e-05, 1.00000000e+00], [1.00000000e-05, 8.00000000e+00], 
     [1.00000000e-05, 1.60000000e+01], [1.00000000e-05, 3.20000000e+01], [1.00000000e-05, 6.40000000e+01], [1.00000000e-05, 1.28000000e+02], 
     [1.00000000e-05, 2.56000000e+02], [1.00000000e-05, 5.12000000e+02], [1.00000000e-04, 1.00000000e+00], [1.00000000e-04, 8.00000000e+00], 
     [1.00000000e-04, 1.60000000e+01], [1.00000000e-04, 3.20000000e+01], [1.00000000e-04, 6.40000000e+01], [1.00000000e-04, 1.28000000e+02], 
     [1.00000000e-04, 2.56000000e+02], [1.00000000e-04, 5.12000000e+02], [1.00000000e-03, 1.00000000e+00], [1.00000000e-03, 8.00000000e+00], 
     [1.00000000e-03, 1.60000000e+01], [1.00000000e-03, 3.20000000e+01], [1.00000000e-03, 6.40000000e+01], [1.00000000e-03, 1.28000000e+02], 
     [1.00000000e-02, 1.00000000e+00], [1.00000000e-02, 8.00000000e+00], [1.00000000e-02, 1.60000000e+01], [1.00000000e-02, 3.20000000e+01], 
     [1.00000000e-02, 6.40000000e+01], [1.00000000e-02, 1.28000000e+02]] 
y = [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.99000000e-17, 5.60000000e-16, 1.12011400e-15, 2.24034300e-15, 
     4.48080000e-15, 7.56193140e-14, 2.17896343e-13, 5.02450401e-13, 6.99000000e-16, 5.60000000e-15, 1.12011430e-14, 2.24034290e-14, 4.48080000e-14, 8.96171430e-14, 
     1.79235429e-13, 3.58472001e-13, 6.99000000e-15, 5.60000000e-14, 1.12011429e-13, 2.24034286e-13, 4.48080000e-13, 8.96171429e-13, 1.79235429e-12, 3.58472000e-12, 
     6.99000000e-14, 5.60000000e-13, 1.10000000e-12, 2.20000000e-12, 4.50000000e-12, 9.00000000e-12, 6.99000000e-13, 5.60000000e-12, 1.12000000e-11, 2.24000000e-11, 
     4.48000000e-11, 8.95000000e-11] 

当我执行了价值[7.10000000e-05, 18]我得到的结果7.95281146e-14插值。如果我将第一列乘以10^3,结果列乘以10^12,那么我得到的结果是完全不同的。我得到0.09352这相当于9.352e-14

  • 有人可以指出为什么scipy在这些情况下给出不同的结果吗?
  • 以下哪些结果是正确的? (我尝试使用Excel,但我很快意识到,scipy使用不同的技术)。
  • 我该如何解决这个问题?
+0

通过乘以'第一列'和结果列,你的意思是什么? – Boud 2013-05-07 09:03:07

+0

X的第一列的数据在1e-6到1e-2的范围内(如果排除零)。通过将该列的元素乘以10^3,该范围被改变为1e-3至1e + 1。同样,y的所有元素都乘以10^+ 12。 – varadark 2013-05-07 09:04:11

+1

'LinearNDInterpolator'使用Delaunay三角剖分法对数据点位置(此处为“X”)进行三角测量,然后使用每个三角形三个点中每个点处的数据对每个三角形内部进行线性插值。 Delaunay三角测量对数据点位置很敏感。如果您缩放其中一个位置坐标的方式不同于另一个,则不会得到相同的三角剖分。因此,你试图插入的位置将从不同的三点获得'y'数据。 – 2013-05-07 14:57:27

回答

1

这是一个机器精度问题。坦率地说,你的y值是甚至超出舍入误差的大小,即对于双精度浮点数约为1.1e-16

检查一个更好的解释What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

您是否建议这对结果发生如此大的变化负责。是对的吗?如果是这样,结果9.352e-14更准确?在其他数据值的情况下,我没有观察到价值的这么大的变化。我仅在N维插值的情况下观察问题。这是因为它涉及更多的操作而不是线性插值? – varadark 2013-05-07 09:14:19

+0

你的错误是关于'0.1e-14'什么是接近机器精度。我建议你尝试用四倍浮点精度实现这一点。很难说,哪个结果更好,因为舍入错误的行为很难跟踪。这需要分析插值函数。 – Jan 2013-05-07 09:38:27

+0

错误大小为1.4e-14。 – varadark 2013-05-07 09:41:54

2

正如罗伯特·克恩上述声明此引用,得到的答案是,这两个答案都是正确的。然而他们回答不同的问题。

当,比如,点(x, y)插值分散的数据,算法必须知道问题的答案:“该数据点是最接近(x, y)现在,明显的方式做到这一点,并使用Delaunay三角在算法是基于,就是用欧氏距离:

distance = sqrt((x[i] - x)**2 + (y[i] - y)**2) 

现在,如果你通过1E3缩放的x坐标,答案“这点是最近的”问题显然可以为y改变 - 坐标变得不那么重要

正确的选择是使用缩放欧几里德距离是合理的。如果你正在做物理学,x坐标和y坐标应该有相同的单位或者都是无量纲的。

+0

我明白为什么答案根据您给出的等式而不同。但是,我不确定我是否理解“x坐标和y坐标应该具有相同的单位或者两者都是无量纲的”。如果我试图插入距离(x)与时间(y)所花费的时间,那么x和y必然会有不同的单位。在这种情况下,x和y的单位非常不同。 – varadark 2013-05-09 03:13:06

+0

作为物理学家讲话:您的问题可能有一些“典型速度”,您可以乘以时间坐标,以产生明智的结果。另一方面,如果你的数据很密集,这个选择只会产生很小的影响:请注意,即使在数据稀疏的情况下,缩放比例的大变化之间的差异也只有20%。这里的要点是,您正在使用有关数据的先验知识在数据点之间进行插值。 – 2013-05-11 12:17:05