0

我需要以相当间接的方式拟合数据。要在拟合中恢复的原始数据是一些线性函数,上面有小的振荡和漂移,我想识别它。我们称之为 f(t)。我们不能在实验中直接记录这个参数,只能间接记录,比如 g(f) = sin(af(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 中做到这一点?

还有其他想法吗?

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

谢谢

4

2 回答 2

0

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

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

拟合函数 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() 评估期间给出这个缩减集。

于 2012-07-13T07:23:24.630 回答
0

您需要的是样条基函数矩阵 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 splines,y_i 是要在最小二乘优化中估计的参数。(大致基于我前段时间看到的一个脚本,该脚本使用它来创建与 scipy 版本不同的平滑样条曲线。我不记得我在哪里看到的。)

于 2012-07-07T03:30:03.423 回答