2012-07-05 63 views
0

我需要以相当的间接方式来拟合数据。在拟合中恢复的原始数据是一些线性函数,具有小的振荡和漂移,我想确定。我们称之为f(t)。我们不能直接在实验中记录这个参数,但是只能间接地假设为g(f)= sin(a f(t))。 (真正的传输函数更复杂,但它不应该在这里起作用)Scipy/Python间接样条插值

所以如果f(t)改变方向朝向sin函数的转折点,这是很难识别,我尝试了一种替代方案方法来恢复f(t)而不仅仅是g的逆函数和一些数据继续猜测:我创建了一个模型函数fm(t),它经历了相同的已知传递函数g()和fit g(fm(t) ))到数据。由于数据集非常庞大,因此我会对连续的数据块进行分段处理,以保证整个集合中fm的连续性。

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

问题是,插值软件包的样条拟合直接对数据进行处理,所以我不能用g(fspline)对样条进行包装,并对其进行样条插值。有什么办法可以在scipy中完成?

还有其他想法吗?

我试图二次函数和固定偏移量和斜率这样以匹配数据的前述安装块的那些,因此,只有一个拟合参数,曲率,非常迅速地开始其偏离

由于

回答

0

什么就需要是样条基函数,b(t)的矩阵,所以可以近似F(T)为样条基函数的线性组合

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

,然后估算的系数,coefs ,通过optimize.leastsq 。

但是,据我所知(除非你借用实验脚本或搜索某些软件包的代码),python中的样条基函数并不是现成的。

相反,你也可以使用多项式,例如

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

,并使用多项式近似代替花键。

该问题的结构与广义线性模型非常相似,其中g是已知的链接函数,与计量经济学中的索引问题相似。

这将是可能的,如果你创建人工数据

使用SciPy的花键以间接的方式
y_i = f(t_i) 

其中f(t_i)是scipy.interpolate花键,以及Y_I是要估计的参数最小二乘法优化。 (松散地基于我之前看到的用于创建与scipy版本不同类型的平滑样条的脚本,我不记得我在哪看到这个。)

0

谢谢你的评论。我尝试了上面提到的多项式基础,但多项式不适合我的需求,他们倾向于创造振铃的广告,这很难调节。

现在我发现使用样条曲线的解决方案非常简单直接,我认为这就是“以间接方式使用样条曲线”的含义。通过interpolate.splev(x,(t,c,k))函数获​​得拟合函数f(t),但通过omptimize.leastsq函数提供样条系数c。这样,f(t)不是直接样条拟合(正如通常通过splrep(x,y)函数获得的那样),而是在拟合中间接进行优化,因此可以对其使用链接函数g。通过对模型数据进行一次splrep评估(xinit,yinit,t = knots),可以获得对c的初始猜测。

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