2013-05-07 72 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