2015-07-12 53 views
1

我想盡量減少使用Scipy的L-BFGS實用程序的目標函數。我將我的目標函數和梯度傳遞給L-BFGS作爲lambda表達式。我準確地傳遞了它所期望的6個參數。我無法弄清楚什麼是錯的。我得到以下錯誤:python lambda - 參數數量不匹配

TypeError: <lambda>() takes exactly 6 arguments (5 given) 

這裏是我的代碼片段,拋出該錯誤的具體線路:

scipy.optimize.fmin_l_bfgs_b(func=lambda w_E,w_S,X_E,Y_E,U_E,U_S: self.ExpectationReg_ObjectiveFunction(w_E,w_S,X_E,Y_E,U_E,U_S), x0=self.w_E, fprime = lambda w_E,w_S,X_E,Y_E,U_E,U_S: self.ExpectationReg_Gradient_event(w_E,w_S,X_E,Y_E,U_E,U_S), args = (self.X_E, self.Y_E, self.U_E, self.U_S)) 

self.ExpectationReg_ObjectiveFunction和ExpectationReg_Gradient_event在類中定義的函數,這個類繼承。

只給一個想法ExpectationReg_ObjectiveFunction的樣子:

def ExpectationReg_ObjectiveFunction(self,w_E,w_S,X_E,Y_E,U_E,U_S): 
    return self.XR_OBJ(w_E,X_E,Y_E,U_E) + self.xr * self.KL_TERM(w_S,U_S) + self.l2 * np.dot(w_S.T, w_S) 

編輯1:這裏是完整的堆棧trace-

Traceback (most recent call last): 
File "LR.py", line 216, in <module> 
lr.Train() 
File "LR.py", line 159, in Train 
(self.wStar_E, self.nll, self.status) = scipy.optimize.fmin_l_bfgs_b(func=lambda w_E,w_S,X_E,Y_E,U_E,U_S: self.ExpectationReg_ObjectiveFunction(w_E,w_S,X_E,Y_E,U_E,U_S), x0=self.w0_E, fprime = lambda w_E,w_S,X_E,Y_E,U_E,U_S: self.ExpectationReg_Gradient_event(w_E,w_S,X_E,Y_E,U_E,U_S), args = (self.X_E, self.Y_E, self.U_E, self.U_S),maxiter=5) 
File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 185, in fmin_l_bfgs_b 
**opts) 
File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 314, in _minimize_lbfgsb 
f, g = func_and_grad(x) 
File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 263, in func_and_grad 
f = fun(x, *args) 
TypeError: <lambda>() takes exactly 6 arguments (5 given) 

編輯2:當我把所有的論點args-

scipy.optimize.fmin_l_bfgs_b(func=lambda wStar_E,w_S,X_E,Y_E,U_E,U_S: self.ExpectationReg_ObjectiveFunction(w_E,w_S,X_E,Y_E,U_E,U_S), x0=self.wStar_E, fprime = lambda w_E,w_S,X_E,Y_E,U_E,U_S: self.ExpectationReg_Gradient_event(w_E,w_S,X_E,Y_E,U_E,U_S), args = (self.X_E, self.Y_E, self.U_E, self.U_S, self.w_E,self.w_S)) 

我收到以下錯誤:

TypeError: <lambda>() takes exactly 6 arguments (7 given) 

編輯3:

​​

我試圖儘量減少對於w_E目標函數。

+1

一個非常優雅的單行:)。您可能需要添加完整的堆棧跟蹤併爲我們創建一個可重複的示例。你的代碼是很難調試的。 – cel

+2

如果您將lambda更改爲實際函數,即使只是暫時性的,也許您的代碼更易於調試。因爲它全部被壓扁並且很難理解。曾經想過給論點賦予更多有意義的名字嗎? –

+0

其實這些變量對我來說很有意義,因爲我在解決目標函數後直接將它們放入代碼中。但我知道這對其他人來說是壓倒性的。 w是權重向量。 X是特徵向量,Y是標籤向量。相當標準的東西。 E代表事件,S代表情緒 - 我想共同模擬的兩件事情。 –

回答

0

我固定的問題我自己。通過我的問題,我可能沒有把情況弄清楚。它雜亂無章,雜亂無章。

fmin_l_bfgs_b以參數func,fprime,x0和args爲參數。 func是被最小化的目標函數,fprime是目標函數的梯度,x0是初始權重向量,args是參數列表。

實質上,

func(x,*args)

所以,args是比權重向量其他參數列表(相對於所述目標函數被最小化)。

在我的問題中,有兩個權重向量,我一次最小化了其中一個目標函數。所以在我的情況下,args也應該包含另一個權重向量(這不是我最小化目標函數的那個​​)。我錯誤地從args中刪除了它。

當前工作的代碼如下所示:

scipy.optimize.fmin_l_bfgs_b(func=ExpectationReg_ObjectiveFunction,x0=w_E, fprime = ExpectationReg_Gradient_event, args=(w_S,X_E,Y_E,U_E,U_S)) 
0

從文檔爲fmin_l_bfgs_b(你可以從一個IPython的控制檯fmin_l_bfgs_b?得到這個):

Parameters 
---------- 
func : callable f(x,*args) 
    Function to minimise. 

... 

Returns 
------- 
x : array_like 
    Estimated position of the minimum. 

所以它看起來像的func需要簽名有一個數組作爲它的第一個條目,其中告訴scipy它試圖優化什麼。在你的情況下,它看起來像你試圖同時優化w_E,w_S,所以你將不得不一起考慮他們他們作爲一個單一的權重向量,它傳遞給你的func

w := [w_E1,...,w_Em,w_S1...,w_Sn] 
+0

謝謝。雖然這並沒有解決我的問題,但它給了我解決問題所需的觀點。 –