【问题标题】:Scipy/Python indirect spline interpolationScipy/Python 间接样条插值
【发布时间】:2012-07-05 09:48:25
【问题描述】:

我需要以相当间接的方式拟合数据。要在拟合中恢复的原始数据是一些线性函数,上面有小的振荡和漂移,我想识别它。我们称之为 f(t)。我们不能在实验中直接记录这个参数,只能间接记录,比如 g(f) = sin(a f(t))。 (真正的传递函数比较复杂,但在这里应该不起作用)

因此,如果 f(t) 向 sin 函数的转折点改变方向,则很难识别,我尝试了一种替代方法来恢复 f(t),而不仅仅是 g 的反函数和一些数据继续猜测:

我创建了一个模型函数 fm(t),它经历相同且已知的传递函数 g() 并将 g(fm(t)) 拟合到数据。由于数据集很大,我对连续的数据块进行分段处理,以保证 fm 在整个数据集中的连续性。

第一次尝试是使用使用 optimize.leastsq 的线性函数,其中误差估计来自 g(fm)。这并不完全令人满意,我认为最好将样条拟合到数据中以获得 fspline(t) 作为 f(t) 的模型,从而保证数据及其导数的连续性。

它的问题是,插值包中的样条拟合直接作用于数据,所以我不能使用 g(fspline) 包装样条并对此进行样条插值。有没有办法在 scipy 中做到这一点?

还有其他想法吗?

我尝试了二次函数并修复了偏移量和斜率,以匹配前面拟合的数据块,所以只有一个拟合参数,曲率,它很快就会开始偏离

谢谢

【问题讨论】:

    标签: scipy curve-fitting spline


    【解决方案1】:

    您需要的是样条基函数矩阵 b(t),因此您可以将 f(t) 近似为样条基函数的线性组合

    f(t) = np.dot(b(t), coefs)
    

    然后通过 optimize.leastsq 估计系数 coefs。

    然而,据我所知,样条基函数在 python 中并不容易获得(除非你借用实验脚本或搜索某些包的代码)。

    您也可以使用多项式,例如

    b(t) = np.polynomial.chebvander(t, order) 
    

    并使用多项式近似代替样条。

    这个问题的结构非常类似于广义线性模型,其中 g 是您已知的链接函数,并且类似于计量经济学中的索引问题。

    如果您创建人工数据,则可以以间接方式使用 scipy 样条

    y_i = f(t_i) 
    

    其中 f(t_i) 是 scipy.interpolate 样条曲线,y_i 是要在最小二乘优化中估计的参数。 (大致基于我前段时间看到的一个脚本,该脚本使用它来创建与 scipy 版本不同的平滑样条线。我不记得我在哪里看到的。)

    【讨论】:

      【解决方案2】:

      感谢您提供这些 cmets。我尝试了上面建议的多项式基础,但多项式不能满足我的需求,它们往往会产生振铃,这很难调节。

      我现在找到的使用样条的解决方案非常简单明了,我认为这就是您所说的“以间接方式使用样条”的意思。

      拟合函数 f(t) 是通过 interpolate.splev(x, (t,c,k)) 函数获得的,但通过 omptimize.leastsq 函数提供样条系数 c。这样,f(t) 不是直接样条拟合(通常使用 splrep(x, y) 函数获得),而是在拟合中间接优化,因此可以在其上使用链接函数 g。对 c 的初始猜测可以通过对模型数据的 splrep(xinit, yinit, t=knots) 进行一次评估来获得。

      一个技巧是通过在 splrep() 函数调用期间显式指定样条曲线的节点数限制在数据点数以下,并在使用 splev() 评估期间给出这个缩减集。

      【讨论】:

        猜你喜欢
        • 2011-09-08
        • 2019-08-05
        • 2012-11-03
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多