scipy.interpolate.

RBFInterpolator#

class scipy.interpolate.RBFInterpolator(y, d, neighbors=None, smoothing=0.0, kernel='thin_plate_spline', epsilon=None, degree=None)[源代码]#

N 维中的径向基函数 (RBF) 插值。

参数:
y(npoints, ndims) array_like

数据点坐标的二维数组。

d(npoints, …) array_like

y 处的数据值的 N 维数组。d 沿第一轴的长度必须等于 y 的长度。与某些插值器不同,插值轴不能更改。

neighborsint, 可选

如果指定,则在每个评估点处插值的值将仅使用这么多最近的数据点进行计算。默认情况下,使用所有数据点。

smoothingfloat 或 (npoints, ) array_like,可选

平滑参数。当设置为 0 时,插值器完美拟合数据。对于较大的值,插值器接近于具有指定次数的多项式的最小二乘拟合。默认值为 0。

kernelstr, 可选

RBF 的类型。这应该是以下之一

  • ‘linear’ : -r

  • ‘thin_plate_spline’ : r**2 * log(r)

  • ‘cubic’ : r**3

  • ‘quintic’ : -r**5

  • ‘multiquadric’ : -sqrt(1 + r**2)

  • ‘inverse_multiquadric’ : 1/sqrt(1 + r**2)

  • ‘inverse_quadratic’ : 1/(1 + r**2)

  • ‘gaussian’ : exp(-r**2)

默认值为 ‘thin_plate_spline’。

epsilonfloat, 可选

缩放 RBF 输入的形状参数。如果 kernel 为 ‘linear’、‘thin_plate_spline’、‘cubic’ 或 ‘quintic’,则此参数默认为 1 并且可以忽略,因为它与缩放平滑参数具有相同的效果。否则,必须指定此参数。

degreeint, 可选

添加的多项式的次数。对于某些 RBF,如果多项式次数太小,插值器可能不适定。这些 RBF 及其对应的最小次数为

  • ‘multiquadric’ : 0

  • ‘linear’ : 0

  • ‘thin_plate_spline’ : 1

  • ‘cubic’ : 1

  • ‘quintic’ : 2

默认值是 kernel 的最小次数,如果没有最小次数,则为 0。将其设置为 -1 表示不添加多项式。

备注

RBF 是 N 维空间中的标量值函数,其在 \(x\) 处的值可以用 \(r=||x - c||\) 表示,其中 \(c\) 是 RBF 的中心。

对于来自位置 \(y\) 的数据值向量 \(d\) 的 RBF 插值器是中心位于 \(y\) 的 RBF 的线性组合,再加上具有指定次数的多项式。RBF 插值器可以写成

\[f(x) = K(x, y) a + P(x) b,\]

其中 \(K(x, y)\) 是 RBF 的矩阵,中心位于 \(y\),并在点 \(x\) 处求值,\(P(x)\) 是单项式矩阵,它跨越在 \(x\) 处求值的具有指定次数的多项式。系数 \(a\)\(b\) 是线性方程组的解

\[(K(y, y) + \lambda I) a + P(y) b = d\]

\[P(y)^T a = 0,\]

其中 \(\lambda\) 是非负平滑参数,它控制我们想要拟合数据的程度。当平滑参数为 0 时,数据被精确拟合。

如果满足以下要求,则上述系统是唯一可解的

  • \(P(y)\) 必须具有满列秩。当 degree 为 -1 或 0 时,\(P(y)\) 始终具有满列秩。当 degree 为 1 时,如果数据点位置并非全部共线 (N=2)、共面 (N=3) 等,则 \(P(y)\) 具有满列秩。

  • 如果 kernel 为 ‘multiquadric’、‘linear’、‘thin_plate_spline’、‘cubic’ 或 ‘quintic’,则 degree 不得低于上面列出的最小值。

  • 如果 smoothing 为 0,则每个数据点位置必须不同。

当使用非尺度不变的 RBF(‘multiquadric’、‘inverse_multiquadric’、‘inverse_quadratic’ 或 ‘gaussian’)时,必须选择适当的形状参数(例如,通过交叉验证)。形状参数的值越小,对应的 RBF 就越宽。当形状参数太小时,问题可能会变得病态或奇异。

求解 RBF 插值系数所需的内存量随着数据点的数量呈二次方增加,这在插值超过大约一千个数据点时会变得不切实际。为了克服大型插值问题的内存限制,可以指定 neighbors 参数,以仅使用最近的数据点为每个评估点计算 RBF 插值器。

在版本 1.7.0 中添加。

参考文献

[1]

Fasshauer, G., 2007. Meshfree Approximation Methods with Matlab. World Scientific Publishing Co.

[3]

Wahba, G., 1990. Spline Models for Observational Data. SIAM.

示例

演示将散点数据插值到 2-D 网格。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.interpolate import RBFInterpolator
>>> from scipy.stats.qmc import Halton
>>> rng = np.random.default_rng()
>>> xobs = 2*Halton(2, seed=rng).random(100) - 1
>>> yobs = np.sum(xobs, axis=1)*np.exp(-6*np.sum(xobs**2, axis=1))
>>> xgrid = np.mgrid[-1:1:50j, -1:1:50j]
>>> xflat = xgrid.reshape(2, -1).T
>>> yflat = RBFInterpolator(xobs, yobs)(xflat)
>>> ygrid = yflat.reshape(50, 50)
>>> fig, ax = plt.subplots()
>>> ax.pcolormesh(*xgrid, ygrid, vmin=-0.25, vmax=0.25, shading='gouraud')
>>> p = ax.scatter(*xobs.T, c=yobs, s=50, ec='k', vmin=-0.25, vmax=0.25)
>>> fig.colorbar(p)
>>> plt.show()
../../_images/scipy-interpolate-RBFInterpolator-1.png

方法

__call__(x)

x 处评估插值器。