2017-05-05 59 views
0

我想在python中擬合三次樣條來對噪聲x,y數據進行噪聲提取並提取每個區間的樣條係數(即我期望獲得每個區間的四個樣條係數)不同的python函數來擬合三次樣條,找到係數

到目前爲止,我已經試過(全部來自scipy.interpolate):

1)CubicSpline,但這種方法並不能讓我順利的花鍵,導致不現實的,跳動的係數數據。

2)合併spl and和脾,例如,

tck = splrep(x, y, k=3, s=1e25) 

其中I提取的係數/結使用

F = PPoly.from_spline(tck) 
coeffs = F.c 
knots = F.x 

然而,我無法找到在整個的x範圍平滑係數(接近於零,1e23值之間跳躍,這是非物理)甚至如果我將平滑參數s加大到非常大的數字,最終導致結節數量太少,因爲結節數量隨s減少。似乎我無法同時找到合適的參數s和節點數。

3)I使用 UnivariateSpline(X,Y,K = 3,S = 0.03) 在這裏,我發現了更好的靈敏度變化的S,但相應get_coeffs()方法不爲每個間隔提供4個係數但只有一個,我不明白。 4)我也試過用三階多項式進行分段脊線性迴歸,但是這種方法對擬合提供了太大的百分比誤差,所以很容易得到其中一種標準樣條函數的工作方式。

我缺少什麼?有人可以幫忙嗎?

回答

0

我在這裏看到的具體問題是UnivariateSpline不能產生插值樣條函數中x的各種冪的代數係數。這是因爲它保留在專有_data屬性中的係數,它也以get_coeffs方法返回,這是一種B-spline coefficients。這些係數描述沒有任何冗餘的樣條曲線(對於N自由度的樣條曲線,您需要N個樣條曲線),但是它們所附帶的基本樣條曲線有些複雜。

但您可以使用樣條對象的derivatives方法獲得所需的係數種類。它返回給定點x處的所有四個導數,從那個點很容易找到Taylor coefficients。使用這種方法很自然,其中x是插值的結點​​,不包括最右邊的一個;所獲得的係數從該結到下一個有效。這裏是一個例子,完整的「花哨」格式化輸出。

import numpy as np 
from scipy.interpolate import UnivariateSpline 
spl = UnivariateSpline(np.arange(6), np.array([3, 1, 4, 1, 5, 9]), s=0) 
kn = spl.get_knots() 
for i in range(len(kn)-1): 
    cf = [1, 1, 1/2, 1/6] * spl.derivatives(kn[i]) 
    print("For {0} <= x <= {1}, p(x) = {5}*(x-{0})^3 + {4}*(x-{0})^2 + {3}*(x-{0}) + {2}".format(kn[i], kn[i+1], *cf)) 

的結是0,2,3,5在此實例中。輸出是:

For 0.0 <= x <= 2.0, p(x) = -3.1222222222222222*(x-0.0)^3 + 11.866666666666667*(x-0.0)^2 + -10.744444444444445*(x-0.0) + 3.000000000000001 
For 2.0 <= x <= 3.0, p(x) = 4.611111111111111*(x-2.0)^3 + -6.866666666666667*(x-2.0)^2 + -0.7444444444444436*(x-2.0) + 4.000000000000001 
For 3.0 <= x <= 5.0, p(x) = -2.322222222222221*(x-3.0)^3 + 6.966666666666665*(x-3.0)^2 + -0.6444444444444457*(x-3.0) + 1.0000000000000016 

注意,對於每一塊,cf保持係數從最低程度,因此,格式化字符串時的順序是相反的。

(當然,你可能想要做的這些係數別的東西)密謀

要檢查的公式是正確的,我複製粘貼他們:

spline