是否有一个Python等价于平滑.splineR中的函数

2024-10-01 11:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我看过了scipy.interpolate.UnivariateSpline然而,Python中的其他样条线变体似乎只能通过增加结的数量和为允许的SS残差设置一个阈值(称为s)来权衡。相比之下平滑.spline在R中,允许在所有的x值处都有结,而不必有一条弯曲的曲线击中所有点——惩罚来自二阶导数。在

Python是否有这样的样条曲线拟合机制?允许所有结但惩罚二阶导数?在


Tags: 数据函数df参数定义scipy曲线平均值
3条回答

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

相比之下平滑.spline在R中,允许在所有x值处有结,而不必有一条弯曲的曲线,它击中了所有点,惩罚来自二阶导数。在

您可以在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)

如果您想直接设置lambdaspline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)不起作用,因为lambda在Python中已经有了另一个含义,但是有一个解决方案:How to use the lambda argument of smooth.spline in RPy WITHOUT Python interprating it as lambda

要使代码运行,首先需要定义数据x_train和{},如果想以全高清分辨率在-3和5之间绘制,则可以定义x_smooth=np.array(np.linspace(-3,5,1920)).

我一直在寻找完全相同的东西,但是我不想把代码翻译成Python。不过,spliter包似乎是一个选项:https://github.com/bgrimstad/splinter

相关问题 更多 >