RBFInterpolator#
- class scipy.interpolate.RBFInterpolator(y, d, neighbors=None, smoothing=0.0, kernel='thin_plate_spline', epsilon=None, degree=None)[source]#
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)\) 是中心位于 \(y\) 并在点 \(x\) 处评估的 RBF 矩阵,而 \(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.
示例
演示将散点数据插值到二维网格中。
>>> 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()
方法
__call__
(x)在 x 处评估插值器。