2012-09-27 44 views
3

我在Python中插入一些數據以便在常規網格上對其進行插值,以便我可以部分地將它集成它。數據表示高維參數空間(目前3,至少擴展到5)的函數並返回可觀測值的多值函數(目前是2,擴展到3,然後可能是幾十)。scipy.interpolate.LinearNDInterpolator在大型數據集上無限期地掛起

我正在通過scipy.interpolate.LinearNDInterpolator執行插值,因爲缺少其他明顯的選項(因爲我知道griddata只是調用它)。在一小部分數據集上(15,000行柱狀數據),它可以正常工作。在較大的集合(60,000+)上,該命令似乎無限期地運行。 top表示iPython正在使用100%的CPU,並且終端完全無響應,包括至C-c。到目前爲止,我已經離開了它幾個小時無濟於事,最終我想通過數百萬條。

我懷疑這個問題與this ticket有關,但據推測這是在我昨天升級的SciPy 0.10.0中修補的。

我的問題基本上是如何在大數據集上執行多維插值?根據我的嘗試,有一些解決方案可能來自哪些地方,但我沒有找到它們。

  • 什麼用LinearNDInterpolator走錯了(我的搜索沒有的事實,幾個SciPy的的子域seem to be down的...幫助)?或者,至少,我如何才能找出問題所在,並設法規避懸掛?
  • 有沒有一種方法來重新插值,以便LinearNDInterpolator可以工作?也許通過謹慎地分類數據來重新分配數據?
  • 是否還有其他高維插補器更適合該問題? (我注意到,大多數SciPy的的替代品僅限於<二維參數空間。)
  • 是否有其他方式來獲得多維數據到一個普通用戶定義的網格?這就是我想通過插值來做的...
+1

首先檢查'print scipy。__version__',以便您使用您期望的Scipy版本。要進一步查明問題:嘗試在大數據集上執行Delaunay三角測量:'scipy.spatial.Delaunay(points)'。 0.10.0中的代碼不應包含潛在的無限循環---但是,插值步驟中的最壞情況性能爲N^2(「通常」情況爲N),因此您可以從較小的數據集估計多久它可能需要。另外,在Scipy Trac上提交一張票,如果可能的話,將數據集上傳到某個地方 - 如果發現不瞭解的話,這是正確的投訴地點。 –

回答

4

這個問題很可能是你的數據集太大了,以至於計算其Delaunay三角剖分並沒有在合理的時間內完成。使用從完整數據集中隨機挑選的較小數據子集檢查scipy.spatial.Delaunay的時間縮放比例,以估計整個數據集計算是否在Universe結束之前完成。

如果你的原始數據是在矩形網格上,如

v[i,j,k,l] = f(x[i], y[j], z[k], u[l]) 

然後使用基於三角插值是非常低效。這是更好地利用張量積插值,即由1 d插值方法先後插每個維度:

import numpy as np 
from scipy.interpolate import interp1d 

def interp3(x, y, z, v, xi, yi, zi, method='cubic'): 
    """Interpolation on 3-D. x, y, xi, yi should be 1-D 
    and z.shape == (len(x), len(y), len(z))""" 
    q = (x, y, z) 
    qi = (xi, yi, zi) 
    for j in range(3): 
     v = interp1d(q[j], v, axis=j, kind=method)(qi[j]) 
    return v 

def somefunc(x, y, z): 
    return x**2 + y**2 - z**2 + x*y*z 

# some input data 
x = np.linspace(0, 1, 5) 
y = np.linspace(0, 2, 6) 
z = np.linspace(0, 3, 7) 
v = somefunc(x[:,None,None], y[None,:,None], z[None,None,:]) 

# interpolate 
xi = np.linspace(0, 1, 45) 
yi = np.linspace(0, 2, 46) 
zi = np.linspace(0, 3, 47) 
vi = interp3(x, y, z, v, xi, yi, zi) 

import matplotlib.pyplot as plt 
plt.subplot(121) 
plt.pcolor(xi, yi, vi[:,:,12]) 
plt.title('interpolated') 
plt.subplot(122) 
plt.pcolor(xi, yi, somefunc(xi[:,None], yi[None,:], zi[12])) 
plt.title('exact') 
plt.show() 

如果你的數據集是分散的,太大了基於三角測量的方法,那麼你需要切換以不同的方法。有些選項是同時處理少量最近鄰居的插值方法(這種信息可以用k-d-tree快速檢索)。反距離稱重就是其中之一,但它可能是最糟糕的之一---有可能更好的選擇(我不知道沒有進一步的研究)。

+0

謝謝@pv,這個(和你的評論)是正確的錢。快速縮放評估表明,計算時間大致可以像$ N^2 $那樣擴展,並且我的完整計算需要4年才能完成。我會研究一種替代方法,因爲正如你指出的那樣,我的許多數據的維度都是有規律的,而插值器並不理想。 – Warrick

+1

從SciPy 0.14起,現在在['interpn()']中實現網格數據(任意維)的插值(http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.interpolate .interpn.html)和['RegularGridInterpolator'](http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.interpolate.RegularGridInterpolator.html)。從源代碼來看,兩者似乎都是同義詞。 – balu

相關問題