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()
方法
__call__
(x)在 x 評估插值器。