scipy.interpolate.

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) 類陣列

資料點座標的 2 維陣列。

d(npoints, …) 類陣列

y 的資料值的 N 維陣列。d 沿著第一個軸的長度必須等於 y 的長度。與某些插值器不同,插值軸無法變更。

neighborsint,選用

如果指定,則在每個評估點的插值器值將僅使用這麼多最近的資料點計算。預設會使用所有資料點。

smoothingfloat 或 (npoints, ) 類陣列,選用

平滑參數。當設定為 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 的中心。

資料值向量 \(d\) 的 RBF 插值器(來自位置 \(y\))是以 \(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)\) 必須具有完整行秩。\(P(y)\)degree 為 -1 或 0 時始終具有完整行秩。當 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 評估插值器。