R中的smooth.spline函数允许在粗糙度(由二阶导数的积分平方定义)和拟合点(通过对残差的平方求和所定义)之间进行权衡.这种权衡是通过spar或df参数完成的.在一个极端,你获得最小方块线,另一个你得到一个非常摇摆的曲线,它与所有数据点相交(或者如果你有重复的x值,具有不同的y值,则为平均值)
我在Python中查看了scipy.interpolate.UnivariateSpline和其他样条变量,但是,他们似乎只是通过增加结的数量来进行权衡,并为允许的SS残差设置一个阈值(称为s).相比之下,R中的smooth.spline允许在所有x值处具有节点,而不必具有击中所有点的摇摆曲线 - 惩罚来自二阶导数.
Python是否具有以这种方式运行的样条拟合机制?允许所有结,但惩罚二阶导数?
我想在Python中使用smooth.splineR中的自然三次平滑样条线(就像许多其他人也想要的那样(Python自然平滑样条线,是否有相当于R中的smooth.spline函数的Python,Python SciPy UnivariateSpline vs R smooth.spline, ...))因此我使用的是https://morioh.com/p/eb4151821dc4rpy2中描述的方式,但我想直接设置而不是:lambdaspar
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, lambda=42)
#alternative: spline1 = r_smooth_spline(x=r_x, y=r_y, spar=0.7) would work fine, but I would like to control lambda dirctly
ySpline=np.array(robjects.r['predict'](spline1,robjects.FloatVector(x_smooth)).rx2('y'))
plt.plot(x_smooth,ySpline)
Run Code Online (Sandbox Code Playgroud)
当我这样做时,这条线spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)不起作用,因为Python已经有一个预定义的解释lambda(你可以从蓝色代码突出显示lambda):(我想lambda被解释为平滑惩罚参数lambda。
如果我替换lambda为,spar …