2012-09-06 44 views
1

我試圖用scipy來適應特定的函數,我得到了奇怪的結果。我決定測試的東西我知道,所以我創造了這個答案:scipy.optimze curve_fit返回錯誤的值

from scipy.optimize import curve_fit as cf 
import numpy as np 
import random 

def func(x,a): 
    return a+X 

X =[] 
for i in range (10): 
    V = random.random() 
    X.append(i+3 + V/10) 

print cf(func, np.array(range(10)),np.array(X)) 

我希望得到的東西約3,不過,這裏的輸出:

(array([ -2.18158824e-12]), inf) 

作爲一個方面說明,我試過看看我送點東西給func,我得到這個:

print func(np.array(range(10)),3) 

Traceback (most recent call last): 
    File "/tmp/py1759O-P", line 16, in <module> 
    print func(np.array(range(10)),3) 
    File "/tmp/py1759O-P", line 6, in func 
    return a+X 
TypeError: unsupported operand type(s) for +: 'int' and 'list 

我在做什麼錯?

回答

3

不要使用xX作爲變量名時,他們攜帶這種不同的含義(或者也許你不知道Python是區分大小寫):

def func(x,a): 
    return a+X 

X =[] 

x是numpy的陣列,X是一個列表,而a是一個標量參數值。

a+X由於無法將標量添加到列表中,導致錯誤。

1

在函數中,參數是x,但在函數的主體中使用了X

這是您的代碼的修改版本。它使用numpy的更多功能(例如np.random.random()而不是random.random())。

from scipy.optimize import curve_fit as cf 
import numpy as np 


def func(x, a): 
    return a + x 


n = 10 
xdata = np.arange(n) 
ydata = func(xdata, 3) + np.random.random(n)/10 

print cf(func, xdata, ydata) 

輸出是

(array([ 3.04734293]), array([[ 8.19208558e-05]]))