2016-05-26 73 views
0

我正在尋找一種更好的方式來使用SciPy的的我目前用它來適應參數的線性組合curve_fit()創建擬合函數與SciPy的變化Python中的參數個數更好的辦法curve_fit

和矢量x 。

例如,這裏是一個擬合函數我通過用於與5點的參數嘗試配合,M0-M4:

def degFour(x, m0, m1, m2, m3, m4): 
    return x[0]*m0 + x[1]*m1 + x[2]*m2 + x[3]*m3 + x[4]*m4 

我已經作出多種這些起來使用相同的圖案degTen。它也可以工作。

我的X矢量:

[[ 1.   1.   1.   1.   1.  ] 
[ 1.   0.99990931 0.99963727 0.99918392 0.99854935] 
[ 1.   0.94872591 0.80016169 0.56954235 0.28051747] 
[ 1.   0.84717487 0.43541052 -0.10943716 -0.62083535] 
[ 1.   0.77991807 0.21654439 -0.44214431 -0.90621706] 
[ 1.   0.73162055 0.07053725 -0.62840754 -0.99004899] 
[ 1.   0.68866877 -0.05147065 -0.75956123 -0.99470154] 
[ 1.   0.64892616 -0.15778967 -0.85371386 -0.95020484] 
[ 1.   0.6114128 -0.25234877 -0.91999134 -0.8726402 ] 
[ 1.   0.57600247 -0.33644232 -0.96358568 -0.77361313] 
[ 1.   0.54225052 -0.41192874 -0.98898767 -0.66062942] 
[ 1.   0.29541145 -0.82546415 -0.78311458 0.36278212] 
[ 1.   0.09546594 -0.98177251 -0.28291761 0.92775452] 
[ 1.   -0.07539697 -0.9886306 0.22447646 0.95478091] 
[ 1.   -0.22050008 -0.90275943 0.61861713 0.62994918] 
[ 1.   -0.33964821 -0.76927818 0.86221613 0.18357784] 
[ 1.   -0.54483185 -0.40631651 0.9875802 -0.66981378] 
[ 1.   -0.71937092 0.03498904 0.66903073 -0.99755153] 
[ 1.   -1.   1.   -1.   1.  ]] 

我的Y數據:

[ 3.50032 3.5007 3.6328 3.94564 4.12814 4.2651 4.39586 
    4.51982 4.64394 4.76738 4.88654 5.90314 6.93304 7.99074 
    9.04278 10.02426 12.01392 14.0592 18.1689 ] 

使用curve_fit(degFour,xdata.T,YDATA),我得到正確的係數:

[ 9.14562709 -7.05004692 1.66932215 -0.27868686 0.02097462] 

我根據度數重新創建x數據,所以我會始終傳遞正確形狀的數據。

我試着版本的fbstj's answer關於變量輸入參數。

我用這個:

def vararg(x, *args): 
    return sum(a * x[i] for i, a in enumerate(args)) 

,並結束了與此:

Traceback (most recent call last): 
    File "D:/Libraries/Desktop/PScratch2/vararg.py", line 18, in <module> 
    print(curve_fit(vararg, deg4kary.T, deg4ydata)) 
    File "C:\Python35\lib\site-packages\scipy\optimize\minpack.py", line 606, in curve_fit 
    raise ValueError("Unable to determine number of fit parameters.") 
ValueError: Unable to determine number of fit parameters. 

你可以從跟蹤看,我剛剛通過函數本身。我被卡住了。

+0

您是否嘗試過使用樣條曲線? –

+0

我在這裏展示的這些數據是更大集合的一部分。該集合被分解成子集並進行擬合。結果擬合及其一階導數必須分段連續。還有其他的事情在發揮,但據我所知,我必須使用這種方法。 – Chris

+1

三次樣條的定義是具有分段連續一階導數的立方分段連續插值函數。我會嘗試使用'scipy.interpolate.InterpolatedUnivariateSpline'。 [文檔](http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline。html) –

回答

2

您正在爲數據擬合一個多元線性模型。這可以表示爲您x向量之間的點積,用形狀(npoints, nparams),和係數的一個(nparams,)向量,說m

def linear(x, m): 
    return x.dot(m) 

x = np.random.randn(100, 5) 
m = np.random.randn(5) 

y = linear(x, m) 

真的沒有必要使用curve_fit得到m係數 - 它更簡單和更有效地使用np.linalg.lstsq求解線性系統如此:

m_hat, residuals, rank, singular_vals = np.linalg.lstsq(x, y) 

這裏,m_hat將是包含0的最小二乘估計的(n_params,)矢量,m1,m2等。這將適用於任何數量的係數。

+0

您的答案肯定比我之前實現的更優雅,但我在使用它時遇到了問題。例如,我從兩組值開始,這兩個值都是(m,),然後從獨立變量創建一個線性映射到名爲k的範圍[-1,1]。 然後我創建一個數組(m,n),其中n + 1是我希望使用的係數的數目,coeff_n = [0,n]。數組值是cos(coeff_n * arccos(k))。這些列是基本向量,第一個是所有的列。第二個是K等 鑑於此設置,我將如何使用您的方法?謝謝。 – Chris

相關問題