當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy interpolate.make_lsq_spline用法及代碼示例


本文簡要介紹 python 語言中 scipy.interpolate.make_lsq_spline 的用法。

用法:

scipy.interpolate.make_lsq_spline(x, y, t, k=3, w=None, axis=0, check_finite=True)#

計算基於 LSQ(最小二乘)的擬合 B-spline(的係數)。

結果是線性組合

B-spline 基本元素中的 ,它最小化

參數

x 數組, 形狀 (m,)

橫坐標。

y 數組, 形狀 (m, ...)

縱坐標。

t 數組,形狀(n + k + 1,)。

結。結點和數據點必須滿足Schoenberg-Whitney 條件。

k 整數,可選

B-spline學位。默認為立方體,k = 3

w 數組,形狀 (m,),可選

樣條擬合的權重。必須是正的。如果 None ,則權重全部相等。默認為 None

axis 整數,可選

插值軸。默認為零。

check_finite 布爾型,可選

是否檢查輸入數組是否僅包含有限數。禁用可能會提高性能,但如果輸入確實包含無窮大或 NaN,則可能會導致問題(崩潰、非終止)。默認為真。

返回

b 度為 k 且帶有結 t 的 BSpline 對象。

注意

數據點的數量必須大於樣條線階數 k

t 必須滿足 Schoenberg-Whitney 條件,即,必須存在數據點 x[j] 的子集,使得 t[j] < x[j] < t[j+k+1] 對應於 j=0, 1,...,n-k-2

例子

生成一些嘈雜的數據:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()
>>> x = np.linspace(-3, 3, 50)
>>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(50)

現在擬合帶有預定義內部結的平滑三次樣條。在這裏,我們通過添加邊界結來使結向量 (k+1)-regular:

>>> from scipy.interpolate import make_lsq_spline, BSpline
>>> t = [-1, 0, 1]
>>> k = 3
>>> t = np.r_[(x[0],)*(k+1),
...           t,
...           (x[-1],)*(k+1)]
>>> spl = make_lsq_spline(x, y, t, k)

為了比較,我們還為同一組數據構建了一個插值樣條曲線:

>>> from scipy.interpolate import make_interp_spline
>>> spl_i = make_interp_spline(x, y)

繪製兩者:

>>> xs = np.linspace(-3, 3, 100)
>>> plt.plot(x, y, 'ro', ms=5)
>>> plt.plot(xs, spl(xs), 'g-', lw=3, label='LSQ spline')
>>> plt.plot(xs, spl_i(xs), 'b-', lw=3, alpha=0.7, label='interp spline')
>>> plt.legend(loc='best')
>>> plt.show()
scipy-interpolate-make_lsq_spline-1_00_00.png

NaN 處理:如果輸入數組包含nan值,結果沒有用,因為底層樣條擬合例程無法處理nan.一種解決方法是對not-a-number 數據點使用零權重:

>>> y[8] = np.nan
>>> w = np.isnan(y)
>>> y[w] = 0.
>>> tck = make_lsq_spline(x, y, t, w=~w)

請注意,需要用數值替換 nan(隻要相應的權重為零,精確值無關緊要。)

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.interpolate.make_lsq_spline。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。