2012-04-15 34 views
2

我試圖擬合一個函數,它將輸入2個獨立變量x,y和3個參數作爲參數a,b,c。這是我的測試代碼:將參數傳遞給函數進行擬合

import numpy as np 
from scipy.optimize import curve_fit 

def func(x,y, a, b, c): 
    return a*np.exp(-b*(x+y)) + c  

y= x = np.linspace(0,4,50) 
z = func(x,y, 2.5, 1.3, 0.5) #works ok 
#generate data to be fitted 
zn = z + 0.2*np.random.normal(size=len(x)) 
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!! 

但我得到錯誤:「func()需要5個參數(給定51)」。如何正確地傳遞我的參數x,y?

+0

'curve_fit'的文檔是怎麼說'func'參數的?顯然它試圖用51個參數來調用它,所以也許你應該重新閱讀文檔。 – Wes 2012-04-15 17:06:56

回答

6

看一看documentation of scipy.optimize.curve_fit()就足夠了。原型是

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw) 

文檔狀態curve_fit()被稱爲與目標函數作爲第一個參數,自變量(多個)作爲第二個參數,因變量作爲第三個參數ANS的參數的起始值作爲第四個論點。您嘗試以完全不同的方式調用該函數,因此它不起作用並不奇怪。具體而言,您通過zn作爲p0參數 - 這就是爲什麼使用這麼多參數調用函數的原因。

的文檔還描述了目標函數是如何調用:

f : callable
The model function, f(x, ...) . It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.

xdata : An N -length sequence or an (k,N) -shaped array
for functions with k predictors. The independent variable where the data is measured.

您嘗試使用爲因變量分隔參數,而應該是參數的單一陣列。以下是修正的代碼:

def func(x, a, b, c): 
    return a * np.exp(-b * (x[0] + x[1])) + c  

N = 50 
x = np.linspace(0,4,50) 
x = numpy.array([x, x])   # Combine your `x` and `y` to a single 
           # (2, N)-array 
z = func(x, 2.5, 1.3, 0.5) 
zn = z + 0.2 * np.random.normal(size=x.shape[1]) 
popt, pcov = curve_fit(func, x, zn) 
+0

非常感謝,問題解決了! – elyase 2012-04-15 20:20:41

0

嘗試前兩個陣列參數傳遞給func爲元組和修改func接受的參數

通常情況下,預計curvefit將接受的x和y參數func(x)作爲輸入,以適應一個元組曲線。奇怪的是,在你的例子中,你的x參數不是一個單獨的值,而是兩個值(不知道爲什麼),你必須修改你的函數,以便它接受x作爲單個參數並將其展開。

一般而言,三維曲線擬合應該以與您嘗試實現的方式不同的方式進行處理。您可以看看下面的SO帖子,該帖子試圖用線條擬合三維散點圖。

>>> def func((x,y), a, b, c): 
    return a*np.exp(-b*(x+y)) + c 

>>> y= x = np.linspace(0,4,50) 
>>> z = func((x,y), 2.5, 1.3, 0.5) #works ok 
>>> zn = z + 0.2*np.random.normal(size=len(x)) 
>>> popt, pcov = curve_fit(func, (x,y), zn)