2012-07-05 76 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()的評估過程中給出這個減少的集合,將樣條曲線的節點數限制在數據點的數目以下。