【问题标题】:Is there a Python equivalent to the smooth.spline function in R是否有与 R 中的 smooth.spline 函数等效的 Python
【发布时间】:2015-06-01 10:47:13
【问题描述】:

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

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

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

【问题讨论】:

标签: python r smoothing splines


【解决方案1】:

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

如果要直接设置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_trainy_train,如果您想以全高清分辨率在-3 和5 之间绘制它,您可以定义x_smooth=np.array(np.linspace(-3,5,1920)).

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-12-31
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 2016-06-28
        • 2010-10-30
        • 2018-10-14
        相关资源
        最近更新 更多