本文簡要介紹 python 語言中 scipy.interpolate.make_smoothing_spline
的用法。
用法:
scipy.interpolate.make_smoothing_spline(x, y, w=None, lam=None)#
使用
lam
計算平滑三次樣條函數(的係數),以控製曲線的平滑度與其與數據的接近程度之間的權衡。如果lam
為 None,則使用 GCV 標準 [1] 來查找它。找到平滑樣條作為正則化加權線性回歸問題的解:
其中 是樣條函數, 是權重向量, 是正則化參數。
如果
lam
為None,我們使用GCV標準來尋找最佳正則化參數,否則我們用給定參數求解正則化加權線性回歸問題。參數通過以下方式控製權衡:參數越大,函數越平滑。- x: 數組, 形狀 (n,)
橫坐標。 n 必須大於 5。
- y: 數組, 形狀 (n,)
縱坐標。 n 必須大於 5。
- w: 數組,形狀(n,),可選
權重向量。默認為
np.ones_like(x)
。- lam: 浮點數,( ),可選
正則化參數。如果
lam
為None,則從GCV標準中找到。默認為“無”。
- func: BSpline 對象。
表示基於 B-spline 的樣條線的可調用函數,作為在
lam
為 None 的情況下使用 GCV 標準 [1] 平滑樣條線問題的解決方案,否則使用給定參數lam
。
參數 ::
返回 ::
注意:
該算法是 Woltring 在 FORTRAN [2] 中引入的算法的幹淨室重新實現。由於許可證問題,原始版本無法在SciPy源代碼中使用。此處討論了重新實現的細節(僅提供俄語版本)[4]。
如果權重向量
w
為None,我們假設所有點的權重相等,並且權重向量是1的向量。請注意,在加權殘差平方和中,權重不是平方:
splrep
中,總和是根據權重平方構建的。 ,而在如果初始問題是ill-posed(例如,產品 (其中 是設計矩陣)不是正定義矩陣),則會引發ValueError。
參考:
[1]G. Wahba,觀測數據樣條模型中的“估計平滑參數”,賓夕法尼亞州費城:工業與應用數學學會,1990 年,第 45-65 頁。 DOI:10.1137/1.9781611970128
[2]H. J. Woltring,用於廣義的 Fortran 包,cross-validatory 樣條平滑和微分,工程軟件進展,卷。 8、不。 2,第 104-113 頁,1986 年。DOI:10.1016/0141-1195(86)90098-7
[3]T. Hastie、J. Friedman 和 R. Tisbshirani,“Smoothing Splines”,《統計學習的要素:數據挖掘、推理和預測》,紐約:Springer,2017 年,第 241-249 頁。 DOI:10.1007/978-0-387-84858-7
[4]E. Zemlyanoy,“廣義交叉驗證平滑樣條”,理學學士論文,2022 年。https://www.hse.ru/ba/am/students/diplomas/620910604(俄語)
例子:
生成一些噪聲數據
>>> import numpy as np >>> np.random.seed(1234) >>> n = 200 >>> def func(x): ... return x**3 + x**2 * np.sin(4 * x) >>> x = np.sort(np.random.random_sample(n) * 4 - 2) >>> y = func(x) + np.random.normal(scale=1.5, size=n)
製作平滑樣條函數
>>> from scipy.interpolate import make_smoothing_spline >>> spl = make_smoothing_spline(x, y)
繪製兩者
>>> import matplotlib.pyplot as plt >>> grid = np.linspace(x[0], x[-1], 400) >>> plt.plot(grid, spl(grid), label='Spline') >>> plt.plot(grid, func(grid), label='Original function') >>> plt.scatter(x, y, marker='.') >>> plt.legend(loc='best') >>> plt.show()
相關用法
- Python SciPy interpolate.make_interp_spline用法及代碼示例
- Python SciPy interpolate.make_lsq_spline用法及代碼示例
- Python SciPy interpolate.krogh_interpolate用法及代碼示例
- Python SciPy interpolate.InterpolatedUnivariateSpline用法及代碼示例
- Python SciPy interpolate.BSpline用法及代碼示例
- Python SciPy interpolate.LSQSphereBivariateSpline用法及代碼示例
- Python SciPy interpolate.griddata用法及代碼示例
- Python SciPy interpolate.splder用法及代碼示例
- Python SciPy interpolate.LinearNDInterpolator用法及代碼示例
- Python SciPy interpolate.PPoly用法及代碼示例
- Python SciPy interpolate.NdBSpline用法及代碼示例
- Python SciPy interpolate.pade用法及代碼示例
- Python SciPy interpolate.barycentric_interpolate用法及代碼示例
- Python SciPy interpolate.RegularGridInterpolator用法及代碼示例
- Python SciPy interpolate.NdPPoly用法及代碼示例
- Python SciPy interpolate.interp2d用法及代碼示例
- Python SciPy interpolate.approximate_taylor_polynomial用法及代碼示例
- Python SciPy interpolate.RectSphereBivariateSpline用法及代碼示例
- Python SciPy interpolate.sproot用法及代碼示例
- Python SciPy interpolate.splantider用法及代碼示例
- Python SciPy interpolate.CloughTocher2DInterpolator用法及代碼示例
- Python SciPy interpolate.interp1d用法及代碼示例
- Python SciPy interpolate.BPoly用法及代碼示例
- Python SciPy interpolate.BarycentricInterpolator用法及代碼示例
- Python SciPy interpolate.splrep用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.interpolate.make_smoothing_spline。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。