繁体   English   中英

python lambda-参数数量不匹配

[英]python lambda - number of arguments mismatch

我正在尝试使用Scipy的L-BFGS实用程序来最小化目标函数。 我将目标函数及其梯度传递给L-BFGS作为lambda表达式。 我正按照预期传递6个参数。 我无法弄清楚出了什么问题。 我收到以下错误:

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:这是完整的堆栈跟踪-

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 = classifier weights for Event
w_S = classifier weights for Sentiment
X_E = Feature vector for training set of Event
Y_E = Labels Vector for event
U_E = Feature vector for unlabeled set of Event
U_S = Feature vector for unlabeled set of Sentiment

我正在尝试针对w_E最小化目标函数。

fmin_l_bfgs_b的文档中(您可以使用fmin_l_bfgs_b?从IPython控制台中获取它):

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] 

我自己解决了这个问题。 通过我的问题,我可能没有足够清楚地说明情况。 这很复杂,所有的东西都很混乱。

fmin_l_bfgs_b将func,fprime,x0和args作为参数。 func是要最小化的目标函数,fprime是目标函数的梯度,x0是初始权重向量,args是参数列表。

实质上,

func(x,*args)

因此, argsargs重向量之外的参数列表(相对于此,目标函数应最小化)。

在我的问题中,有两个权重向量,我一次将其中一个的目标函数最小化。 因此,在我的情况下, 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM