【问题标题】:Python Least-Squares Natural SplinesPython 最小二乘自然样条
【发布时间】:2023-04-11 03:43:02
【问题描述】:

我正在尝试找到一个适合自然样条的数值包,该样条可以最小化加权最小二乘。

scipy 中有一个包可以满足我对非自然样条曲线的要求。

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate, randn

x = np.arange(0,5,1.0/6)
xs = np.arange(0,5,1.0/500)

y = np.sin(x+1) + .2*np.random.rand(len(x)) -.1

knots = np.array([1,2,3,4])
tck = interpolate.splrep(x,y,s=0,k=3,t=knots,task=-1)
ys = interpolate.splev(xs,tck,der=0)

plt.figure()
plt.plot(xs,ys,x,y,'x')

【问题讨论】:

    标签: python scipy spline


    【解决方案1】:

    这个来自this pagetar file 内的spline.py 文件默认情况下是自然样条拟合。 this page 上还有一些代码声称大部分是您想要的。 pyD3D package 在其 pyDataUtils 模块中也有一个 natural spline function。最后一个对我来说看起来最有希望。但是,它似乎没有设置您自己的结的选项。也许如果您查看源代码,您可以找到一种方法来纠正它。

    另外,我在 Scipy 邮件列表中找到了this message,它说使用 s=0.0(如在您给定的代码中)使使用上述过程拟合的样条自然根据消息的作者。我确实找到了this splmake 函数,该函数可以选择进行自然样条拟合,但在查看源代码后我发现它尚未实现。

    【讨论】:

    • 感谢您的回复。您指向的文件将使用自然样条插值任何数据。这意味着曲线将通过数据中的每个点。如果数据嘈杂(在我的情况下是),这是一件坏事。如果您将数据分成箱并进行最小二乘近似,我们可以获得一条不会精确插入数据的平滑曲线(这对于嘈杂的数据更好)。我想我将不得不自己写这门课,但这似乎是另外一件事可能出错的事情。再次感谢。
    • 我自己的代码工作了。此外,我再次使用 pyD3D 包查看了第二个选项。起初我以为它只是做了插值,但现在我不确定了。无论哪种方式,我都会将您的答案标记为已接受的答案。
    • 为了清楚起见,声称 s=0.0 产生“自然”样条的答案,我认为是不正确的——自然样条应该在端点的二阶导数上有一个条件,看起来不是在 scipy 中实现
    • @Eldila - 有没有机会分享您编写的代码?
    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 2012-02-26
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多