2016-06-11 108 views
0

我有這樣的功能:SciPy的功能muliple參數

def error(w0, w1): 
    return sum((data.Height - (w1*data.Weight+w0))**2) 

和明年我想res = scipy.optimize.minimize(error, (1, 2), ...

優化它,當我嘗試運行它,我有錯誤:TypeError: error() takes exactly 2 arguments (1 given)

我找到當我將我的功能更改爲:

def error(w): 
    return sum((data.Height - (w[1]*data.Weight+w[0]))**2) 

但我想了解爲什麼我的第一個不能工作。

回答

1

那麼,如果你看一下這個函數的文檔,它說,

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)[source] 

的樂趣就在這裏你的函數和args是要發送的參數。現在在你的第一個代碼中,你的目標函數有兩個參數,但是你發送的是一個元組,那麼根據文檔應該做什麼。

所以簡而言之,你發送給目標函數的是一個元組,但那裏有2個參數,這就是爲什麼會彈出錯誤。

出於同樣的原因,您的第二個代碼工作爲w只是一個元組,因此代碼工作!

0
minimize(fun, x0, args=(), method=None,....): 
""" 
minimize f(x) subject to 
    ... 
    where x is a vector of one or more variables. 

所以第一個參數是你的函數,error,第二個是x0,你的情況的元組,初步猜測。第一個代碼是將x0變成一個數組,x0 = np.asarray(x0)

而且看一個例子功能:

fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2 

我沒有用過這麼多,但可以肯定的樣子,如果你沒有你的函數應該工作:

error(np.array([1,2])) 

這是一致的第二種形式,但不是第一種。

換一種方式,minimize作品通過與初始值,開始np.array(x0),插頭即進入error,以及基於所述返回值試圖其他2元件陣列,變化對初始x0。它不是用多個參數來演奏,而是帶有多個元素的一個參數。