R中的smooth.spline函数允许在粗糙度(由二阶导数的积分平方定义)和拟合点(通过对残差的平方求和所定义)之间进行权衡。这种权衡是通过spar或df参数完成的。在一个极端,你获得最小方块线,另一个你得到一个非常摇摆的曲线,它与所有数据点相交(或者如果你有重复的x值和不同的y值,则为平均值)
我已经看过scipy.interpolate.UnivariateSpline和Python中的其他样条变量,但是,它们似乎只是通过增加结的数量来进行权衡,并为允许的SS残差设置一个阈值(称为s)。相比之下,R中的smooth.spline允许在所有x值处具有节点,而不必具有击中所有点的摇摆曲线 - 惩罚来自二阶导数。
Python是否具有以这种方式运行的样条拟合机制?允许所有结,但惩罚二阶导数?
答案 0 :(得分:0)
我一直在寻找完全相同的东西,但宁愿不必将代码翻译成Python。 Splinter包似乎是一个选项,但是:https://github.com/bgrimstad/splinter
答案 1 :(得分:0)
根据Google的研究,我得出结论
相比之下,R中的smooth.spline允许在所有x值处都有一个结,而不必具有一条碰到所有点的弯曲曲线-惩罚来自二阶导数。
答案 2 :(得分:0)
您可以在Python中将rpy2
与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)
不起作用,因为lambda
在Python中已经具有另一种含义,但是有一个解决方案:{{3 }}。
要运行代码,首先需要定义数据x_train
和y_train
,如果要在-3和5之间绘制数据,则可以定义x_smooth=np.array(np.linspace(-3,5,1920)).
。全高清分辨率。