scipy.interpolate.

UnivariateSpline#

class scipy.interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=3, s=None, ext=0, check_finite=False)[source]#

對給定資料點集進行一維平滑樣條擬合。

舊版

此類別被視為舊版,將不再接收更新。雖然我們目前沒有移除它的計畫,但我們建議新程式碼改用更現代的替代方案。 具體來說,我們建議使用 make_splrep 來代替。

k 次樣條曲線 y = spl(x) 擬合到提供的 xy 資料。s 透過指定平滑條件來指定節點數量。

參數:
x(N,) 類陣列

獨立輸入資料的一維陣列。必須遞增;如果 s 為 0,則必須嚴格遞增。

y(N,) 類陣列

相依輸入資料的一維陣列,長度與 x 相同。

w(N,) 類陣列,可選

樣條擬合的權重。必須為正數。如果 w 為 None,則權重全為 1。預設值為 None。

bbox(2,) 類陣列,可選

指定近似區間邊界的 2 序列。如果 bbox 為 None,則 bbox=[x[0], x[-1]]。預設值為 None。

kint,可選

平滑樣條的次數。必須為 1 <= k <= 5。k = 3 是三次樣條。預設值為 3。

sfloat 或 None,可選

用於選擇節點數量的正平滑因子。節點數量將會增加,直到滿足平滑條件

sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) <= s

然而,由於數值問題,實際條件為

abs(sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) - s) < 0.001 * s

如果 s 為 None,則 s 將設定為 len(w),以用於使用所有資料點的平滑樣條。如果為 0,則樣條將內插所有資料點。這相當於 InterpolatedUnivariateSpline。預設值為 None。使用者可以使用 s 來控制擬合的緊密度和平滑度之間的權衡。較大的 s 表示更多的平滑,而較小的 s 值表示較少的平滑。s 的建議值取決於權重 w。如果權重代表 y 的標準差的倒數,那麼好的 s 值應該在範圍 (m-sqrt(2*m), m+sqrt(2*m)) 內找到,其中 m 是 xyw 中的資料點數量。這表示如果 1/w[i]y[i] 的標準差的估計值,則 s = len(w) 應該是一個好的值。

extint 或 str,可選

控制不在節點序列定義的區間內的元素的外插模式。

  • 如果 ext=0 或 ‘extrapolate’,則傳回外插值。

  • 如果 ext=1 或 ‘zeros’,則傳回 0

  • 如果 ext=2 或 ‘raise’,則引發 ValueError

  • 如果 ext=3 或 ‘const’,則傳回邊界值。

預設值為 0。

check_finitebool,可選

是否檢查輸入陣列是否僅包含有限數字。停用可能會提高效能,但如果輸入包含無限大或 NaN,可能會導致問題(崩潰、非終止或無意義的結果)。預設值為 False。

另請參閱

BivariateSpline

二元樣條的基底類別。

SmoothBivariateSpline

通過給定點的平滑二元樣條

LSQBivariateSpline

使用加權最小平方擬合的二元樣條

RectSphereBivariateSpline

球體上矩形網格上的二元樣條

SmoothSphereBivariateSpline

球座標中的平滑二元樣條

LSQSphereBivariateSpline

使用加權最小平方擬合的球座標中的二元樣條

RectBivariateSpline

矩形網格上的二元樣條

InterpolatedUnivariateSpline

給定資料點集的內插一維樣條。

bisplrep

尋找曲面的二元 B 樣條表示式的函式

bisplev

評估二元 B 樣條及其導數的函式

splrep

尋找一維曲線的 B 樣條表示式的函式

splev

評估 B 樣條或其導數的函式

sproot

尋找三次 B 樣條的根的函式

splint

評估兩個給定點之間 B 樣條的定積分的函式

spalde

評估 B 樣條的所有導數的函式

筆記

資料點的數量必須大於樣條次數 k

NaN 處理:如果輸入陣列包含 nan 值,則結果無用,因為底層樣條擬合常式無法處理 nan。一種變通方法是對非數字資料點使用零權重

>>> import numpy as np
>>> from scipy.interpolate import UnivariateSpline
>>> x, y = np.array([1, 2, 3, 4]), np.array([1, np.nan, 3, 4])
>>> w = np.isnan(y)
>>> y[w] = 0.
>>> spl = UnivariateSpline(x, y, w=~w)

請注意,需要用數值替換 nan(只要對應的權重為零,精確值並不重要。)

參考文獻

基於 [1][2][3][4] 中描述的演算法

[1]

P. Dierckx, “使用樣條函數平滑、微分和積分實驗資料的演算法”,J.Comp.Appl.Maths 1 (1975) 165-184。

[2]

P. Dierckx, “用於平滑矩形網格上資料的快速演算法,同時使用樣條函數”,SIAM J.Numer.Anal. 19 (1982) 1286-1304。

[3]

P. Dierckx, “使用樣條函數進行曲線擬合的改進演算法”,報告 tw54,電腦科學系,K.U. Leuven,1981 年。

[4]

P. Dierckx, “使用樣條的曲線和曲面擬合”,數值分析專著,牛津大學出版社,1993 年。

範例

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.interpolate import UnivariateSpline
>>> rng = np.random.default_rng()
>>> x = np.linspace(-3, 3, 50)
>>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(50)
>>> plt.plot(x, y, 'ro', ms=5)

對平滑參數使用預設值

>>> spl = UnivariateSpline(x, y)
>>> xs = np.linspace(-3, 3, 1000)
>>> plt.plot(xs, spl(xs), 'g', lw=3)

手動變更平滑量

>>> spl.set_smoothing_factor(0.5)
>>> plt.plot(xs, spl(xs), 'b', lw=3)
>>> plt.show()
../../_images/scipy-interpolate-UnivariateSpline-1.png

方法

__call__(x[, nu, ext])

在位置 x 評估樣條(或其 nu 階導數)。

antiderivative([n])

建構一個新的樣條,表示此樣條的反導數。

derivative([n])

建構一個新的樣條,表示此樣條的導數。

derivatives(x)

傳回點 x 處樣條的所有導數。

get_coeffs()

傳回樣條係數。

get_knots()

傳回樣條內部節點的位置。

get_residual()

傳回樣條近似的平方殘差的加權總和。

integral(a, b)

傳回兩個給定點之間樣條的定積分。

roots()

傳回樣條的零點。

set_smoothing_factor(s)

使用給定的平滑因子 s 和上次呼叫時找到的節點繼續樣條計算。

validate_input