python lambda - 参数数量不匹配
python lambda - number of arguments mismatch
我正在尝试使用 Scipy 的 L-BFGS 实用程序最小化我的 objective 函数。我将 objective 函数及其梯度作为 lambda 表达式传递给 L-BFGS。我正像预期的那样传递 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 是 class 中定义的函数,此 class 继承。
只是想知道 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
的 objective 函数。
来自 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 是要最小化的 objective 函数,fprime 是 objective 函数的梯度,x0 是初始权重向量,args 是参数列表。
本质上,
func(x,*args)
因此, args
是权重向量以外的参数列表(objective 函数将相对于其最小化)。
在我的问题中,有两个权重向量,我一次针对其中一个向量最小化了 objective 函数。所以 args
在我的例子中,也应该包含另一个权重向量(这不是我正在最小化 objective 函数的权重向量)。我错误地从 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))
我正在尝试使用 Scipy 的 L-BFGS 实用程序最小化我的 objective 函数。我将 objective 函数及其梯度作为 lambda 表达式传递给 L-BFGS。我正像预期的那样传递 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 是 class 中定义的函数,此 class 继承。
只是想知道 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
的 objective 函数。
来自 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 是要最小化的 objective 函数,fprime 是 objective 函数的梯度,x0 是初始权重向量,args 是参数列表。
本质上,
func(x,*args)
因此, args
是权重向量以外的参数列表(objective 函数将相对于其最小化)。
在我的问题中,有两个权重向量,我一次针对其中一个向量最小化了 objective 函数。所以 args
在我的例子中,也应该包含另一个权重向量(这不是我正在最小化 objective 函数的权重向量)。我错误地从 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))