Python中是否有与R中的smooth.spline函数等效的函数?

20
在 R 中, smooth.spline 函数允许在粗糙度(由第二个导数的积分平方定义)和拟合点(由残差的平方和定义)之间进行权衡。这种权衡是通过 spar 或 df 参数实现的。在一个极端处,你得到最小二乘线,而在另一个极端处,你得到非常弯曲的曲线,该曲线与所有数据点相交(或平均值,如果你有具有不同y值的重复 x 值)。
我查看了Python中的scipy.interpolate.UnivariateSpline和其他样条变体,然而它们似乎只通过增加结点数并设置阈值(称为s)来权衡。与此相反,在R中的smooth.spline允许在所有x值上都有结点,而不一定要有一个弯曲的曲线使其穿过所有点 - 惩罚来自于第二个导数。
Python是否有类似的样条拟合机制?允许所有节点但对第二个导数进行惩罚?

1
可能是 Python自然平滑样条 的重复问题。 - user11563547
3个回答

4
您可以使用rpy2在Python中调用R函数:
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) 将无法运行,因为在Python中lambda已经有了另外一个含义,但是有一个解决办法:如何在RPy中使用smooth.spline的lambda参数而不被Python解释为lambda

要使代码运行,您首先需要定义数据x_trainy_train,如果您希望将其绘制在Full-HD分辨率下-3到5之间,则可以定义x_smooth=np.array(np.linspace(-3,5,1920))

请注意,对于最新版本的rpy2,此代码与Jupyter笔记本电脑不完全兼容。您可以通过使用!pip install -Iv rpy2==3.4.2来修复此问题,如NotImplementedError: Conversion 'rpy2py' not defined for objects of type '<class 'rpy2.rinterface.SexpClosure'>' only after I run the code twice所述。


1

通过在谷歌上的研究,我得出结论:

相比之下,在R中使用smooth.spline可以在所有x值处设置节点,而不一定要有一个波动的曲线来覆盖所有点——惩罚来自于二阶导数。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接