2012-09-27 42 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

相关问题