2015-07-12 112 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

谢谢。虽然这并没有解决我的问题,但它给了我解决问题所需的观点。 –