17

R 中的 smooth.spline 函数允许在粗糙度(由二阶导数的积分平方定义)和拟合点(通过对残差的平方求和定义)之间进行权衡。这种权衡是由 spar 或 df 参数完成的。在一个极端,你得到最小二乘线,另一个你得到一条非常摆动的曲线,它与所有数据点相交(或者如果你复制了具有不同 y 值的 x 值,则为平均值)

我已经查看了 Python 中的 scipy.interpolate.UnivariateSpline 和其他样条变体,但是,它们似乎只能通过增加结数和为允许的 SS 残差设置阈值(称为 s)来进行权衡。相比之下,R 中的 smooth.spline 允许在所有 x 值处都有结,而不必有一条摆动的曲线到达所有点——惩罚来自二阶导数。

Python 是否具有以这种方式运行的样条拟合机制?允许所有结但惩罚二阶导数?

4

3 回答 3

2

您可以在 Python 中使用 R 函数rpy2

import rpy2.robjects as robjects
r_y = robjects.FloatVector(y_train)
r_x = robjects.FloatVector(x_train)

r_smooth_spline = robjects.r['smooth.spline'] #extract R function# run smoothing function
spline1 = r_smooth_spline(x=r_x, y=r_y, spar=0.7)
ySpline=np.array(robjects.r['predict'](spline1,robjects.FloatVector(x_smooth)).rx2('y'))
plt.plot(x_smooth,ySpline)

如果你想直接设置lambda:spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)不起作用,因为lambda在 Python 中已经有了另一个含义,但是有一个解决方案:如何在 RPy 中使用 smooth.spline 的 lambda 参数而不用 Python 将其解释为 lambda

要运行代码,您首先需要定义数据x_trainy_train并且您可以定义x_smooth=np.array(np.linspace(-3,5,1920)). 是否要在 -3 和 5 之间以全高清分辨率绘制它。

于 2019-10-04T15:13:59.553 回答
1

我一直在寻找完全相同的东西,但宁愿不必将代码翻译成 Python。但是,Splinter 包似乎是一种选择:https ://github.com/bgrimstad/splinter

于 2016-05-21T22:10:23.817 回答
1

通过对谷歌的研究,我得出的结论是

相比之下,R 中的 smooth.spline 允许在所有 x 值处都有结,而不必有一条摆动的曲线到达所有点——惩罚来自二阶导数。

于 2019-07-09T13:07:32.790 回答