gpt4 book ai didi

Python SciPy UnivariateSpline 与 R smooth.spline

转载 作者:太空宇宙 更新时间:2023-11-03 20:44:44 25 4
gpt4 key购买 nike

我正在将用 R 编写的脚本移植到 Python。在 R 中,我使用 smooth.spline,在 Python 中,我使用 SciPy UnivariateSpline。它们不会产生相同的结果(即使它们都基于三次样条方法)。有没有办法或 UnivariateSpline 的替代方案,使 Python 样条线返回与 R 相同的样条线?

我是一名数学家。我了解样条线的一般概念。但不是它们在 Python 或 R 中实现的细节。

这里是 R 代码,然后是 Python 代码。两者的输入数据相同。

这是输入数据:

x =  0.0,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1.0
y = -1, 1, 1, -1, 1, 0, .5, .5, .4, .5, -1

这是 R 代码

x = seq(0,1, by = .1); 
y = c(-1,1,1, -1,1,0, .5,.5,.4, .5, -1);
spline_xy = smooth.spline(x,y)
predict(spline_xy,x)

输出:

$x
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

$y
[1] 0.120614583 0.170800975 0.210954680 0.238032338 0.253672155
[6] 0.253684815 0.236432643 0.200264536 0.145403302 0.074993797
[11] -0.004853825

这是Python代码

import numpy as np
from scipy.interpolate import UnivariateSpline
x = np.linspace(0, 1, num = 11, endpoint=True)
y = np.array([-1,1,1, -1,1,0, .5,.5,.4, .5, -1])
spline_xy = UnivariateSpline(x,y)
print('x =', x)
print('ysplined =',spline_xy(x))

输出:

x = [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]

ysplined =
[-0.26433566 -0.02587413 0.18857809 0.36585082 0.49277389
0.55617716 0.54289044 0.43974359 0.23356643 -0.08881119
-0.54055944]

我希望 R $y 中的输出和 Python ysplined 中的输出是相同的。但他们不是。

任何帮助,例如如何设置参数或解释,将不胜感激!预先感谢您。

最佳答案

在我看来,这些是不同的平滑方法。

R中的

smooth.spline是一个“平滑样条线”,它是一个过参数化的自然样条线(每个数据点都有结,内部有三次样条线,线性外推法),使用惩罚最小二乘法选择参数。您可以阅读帮助页面,了解如何计算惩罚的详细信息。

另一方面,Python 的 UnivariateSpline 出现在此处的文档中: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html作为回归样条,通过最小二乘法拟合,没有惩罚。它似乎可以自适应地选择结的数量。

这些是完全不同的算法,我不希望它们给出相同的结果。我不知道是否有一个 R 包使用与 Python 相同的自适应结选择。这个答案:https://stackoverflow.com/a/55481248/2554330声称引用了 Python 中的自然平滑样条实现,但我不知道它是否与 R 的实现匹配。

关于Python SciPy UnivariateSpline 与 R smooth.spline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com