随机散乱数据到三维均匀网格的插值和外推

时间:2014-02-24 16:42:28

标签: python scipy interpolation extrapolation

我有一个256 x 256 x 32网格的规则间隔点,范围在x,y和z以及相关变量“a”。我还在一个更有限的x,y,z空间中有一组随机分散的点,并带有一个相关的变量“b”。我本来想要做的是插入并将我的随机数据外推到与“a”立方体匹配的规则间隔网格,如下所示:

Visual representation.

到目前为止,我已经使用了scipy的griddata来实现插值,这似乎工作正常,但是它无法处理外推(据我所知)并且输出会急剧截断为'nan'值。在研究这个问题的同时,我遇到了一些人第二次使用griddata并使用'nearest'作为插值方法来填充'nan'值。我尝试了这个,但结果似乎不可靠。如果我使用带有'线性'模式的fill_Value,则会获得更合适的效果,但此时它更像是一个软糖,因为fill_Value必须是常量。

我注意到MATLAB有一个ScatteredInterpolant类似乎可以做我想要的,但我无法在Python中找到一个等效的类,也没有弄清楚如何在3D中有效地实现这样的例程。非常感谢任何帮助。

我用于插值的代码如下:

x, y, z, b = np.loadtxt(scatteredfile, unpack = True)

# Create cube to match aCube dimensions
xi = np.linspace(-xmax_aCube, xmax_aCube, 256)
yi = np.linspace(-ymax_aCube, ymax_aCube, 256)
zi = np.linspace(zmin_aCube, zmax_aCube, 32)

# Interpolate scattered points
X, Y, Z = np.meshgrid(xi, yi, zi)
bCube = griddata((x, y, z), b, (X, Y, Z), method = 'linear')    

2 个答案:

答案 0 :(得分:3)

此讨论适用于任何维度。对于您的3D案例,我们首先讨论计算几何,以了解区域的一部分为NaN提供griddata

卷中的散点构成凸包;具有以下属性的几何形状:

  • 表面总是凸起的(顾名思义)
  • 在不违反凸度的情况下,形状的体积是最低的
  • 表面(在3d中)被三角化并关闭

不太正式,凸包(which you can compute easily with scipy)就像在框架上拉伸气球一样,框架角是分散集群的最外点。

在常规网格位置气球中,您已被已知点包围。您可以插入这些位置。在它之外,你必须推断。

外推很难。对于如何做到这一点没有一般规则......它是针对特定问题的。在该地区,像griddata 这样的算法会选择来返回NaN - 这是告诉科学家他/她必须选择一种明智的推断方法的最安全方式。

让我们通过一些方法来做到这一点。

1。 [最糟糕] Botch it

在船体外部分配一些标量值。 In the numpy docs您将看到以下内容:     s =平均值(b)     bCube = griddata((x,y,z),b,(X,Y,Z),method =' linear',fill_value = s)

缺点:这会在船体边界处的插值场中产生明显的不连续性,严重偏差平均标量场值,并且不会尊重数据的功能形式。

2。 [下一个最后]"混合拙劣"

假设您在域的角落应用了一些值。这可能是与散乱点相关联的标量字段的平均值。

很抱歉,这是假代码,因为我根本不使用numpy,但它可能相当清楚

# With a unit cube, and selected scalar value
x, y, z, b = np.loadtxt(scatteredfile, unpack = True)
s = mean(b)
x.append([0 0 0 0 1 1 1 1])
y.append([0 0 1 1 0 0 1 1])
z.append([0 1 0 1 0 1 0 1])
b.append([s s s s s s s s])
# drop in the rest of your code

缺点:这会在船体边界处的插值场的渐变中产生明显的不连续性,相当严重地偏向平均标量场值并且不尊重数据的功能形式。

3。 [STILL PRETTY BAD]最近邻居

对于每个常规NaN点,找到最近的非NaN并指定该值。这是有效和稳定的,但是很粗糙,因为你的场地最终会出现图案化的特征(如从船体辐射出的条纹或光束),通常在视觉上没有吸引力,或者更糟糕的是,在数据平滑性方面是不可接受的

根据数据的密度,您可以使用最近的分散数据点而不是最近的非NaN常规点。这可以通过(再次,伪代码)来完成:

bCube = griddata((x, y, z), b, (X, Y, Z), method = 'linear', fill_value=nan)
bCubeNearest = griddata((x, y, z), b, (X, Y, Z), method = 'nearest')
indicesMask = isNan(bCube)
# Use nearest interpolation outside the hull, keeping linear interpolation inside.
bCube(indicesMask) = bCubeNearest(indicesMask)

使用MATLAB的基于delaunay的方法将揭示更强大的方法来实现类似的单线程,但是这里的numpy看起来有点受限。

4。 [永远不可能]自然加权

在本节中对于不好的解释道歉,我从来没有写过算法,但我确信对自然邻居技术的一些研究会让你走得很远

使用带有某个参数D的距离加权函数,该参数可能与您的框长度相似或两倍(比如说)。你可以调整。对于每个NaN位置,计算每个散点的距离。

# Don't do it this way for anything but small matrices - this is O(NM) 
# and it can be done much more effectively (e.g. MATLAB has a quick 
# natural weighting option), but for illustrative purposes:
for each NaN point 1:N
    for each scattered point 1:M
        calculate a basis function using inverse distance from NaN to point, normalised on D, and store in a [1 x M] vector of weights
Multiply weights by the b value, summate and divide by M   

你基本上想要的是一个能够平滑地移动到远离船体的距离D处的B的平均强度的函数,但是与边界处的船体重合。远离边界,它在最近点上的权重最大。

优点:非常稳定且合理连续。由于加权,单个数据点的噪声比最近邻居更具弹性。

5。 [HEROIC ROCKSTAR]功能形式假设

你对物理学了解多少?假设一个函数形式代表你期望物理学做什么,然后对该分散数据进行该形式的最小二乘(或某种等价)拟合。使用该函数来稳定外推。

一些可以帮助你构建函数的好主意:

  • 您期望对称性还是周期性?
  • b是矢量场的一个组成部分,它具有一些属性,如零发散?
  • 方向性:你是否期望所有角落都一样?或者可能是一个方向的线性变化?
  • 是某个时间点的字段b - 也许平滑的测量时间序列可用于提出基本功能?
  • 是否已有一种像高斯或二次方的已知形式?

一些例子:

  • b表示通过体积的激光束的强度。您希望入口侧名义上与出口相同,其他四个边界为零强度。强度将具有同心高斯分布。

  • b是不可压缩流体中速度场的一个分量。流体必须是无散度的,因此在NaN区域产生的任何区域也必须是无分歧的,因此您应用此条件。

  • b表示房间内的温度。你会期望顶部的温度更高,因为热空气会升高。

  • b表示机翼上的升力,在三个独立变量上进行测试。你可以轻松地在摊位上抬起电梯,所以要确切知道它在这个空间的某些部分是什么。

优点/缺点:做到这一点,它会很棒。弄错了,尤其是非线性函数形式,它会非常错误,并且会导致非常不稳定的结果。

健康警告您不能假设功能表单,获得漂亮的结果,然后使用它们来证明功能形式是正确的。那只是糟糕的科学。表单必须是表现良好且已知独立的数据分析。

答案 1 :(得分:1)

如果点的散布与立方体形状相当吻合,一种方法可能是使用griddata插入适合您的点云的常规数据网格(因此避免使用nans),然后使用此方法规则的值网格作为interpn的输入,这有助于线性外推(但需要常规网格作为输入)。

通过这种方式,您可以像以前一样使用点散点的凸包内的所有点的griddata,并且可以使用interpn来估计作为nans返回的点。

这远非完美,但我认为它更接近于实现您所寻找的目标。

优点:

  • 避免尖锐的不连续性。
  • 捕获数据集边缘的基本线性趋势,而无需了解功能形式。
  • 尊重数据中的不对称性(例如,不会在较远的距离上倾向于总体均值,因此数据集的一侧可能比另一侧的值更大。)

缺点:

  • 这种方法的有效性在很大程度上取决于您可以在最初的点分散的凸包内装入多大的立方体。如果您的数据是spikey / patchy和不规则,那么凸包边缘上的偶数点可能已经从嵌套立方体的边缘推断出相当大的距离,从而导致错误,因为推断不会考虑更近的数据点在立方体之外。
  • 线性外推将受到数据中噪声的严重影响 在点云的边缘。
  • 进行两组插值的计算成本。