我想盡量減少使用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
目標函數。
一個非常優雅的單行:)。您可能需要添加完整的堆棧跟蹤併爲我們創建一個可重複的示例。你的代碼是很難調試的。 – cel
如果您將lambda更改爲實際函數,即使只是暫時性的,也許您的代碼更易於調試。因爲它全部被壓扁並且很難理解。曾經想過給論點賦予更多有意義的名字嗎? –
其實這些變量對我來說很有意義,因爲我在解決目標函數後直接將它們放入代碼中。但我知道這對其他人來說是壓倒性的。 w是權重向量。 X是特徵向量,Y是標籤向量。相當標準的東西。 E代表事件,S代表情緒 - 我想共同模擬的兩件事情。 –