使用scipy优化

时间:2018-06-18 16:30:45

标签: python scipy instance self args

我有一个像这样的类对象和实例方法。

class Neural:
    def __init__(self, params, X, y, lambda1):
        ---
    def costFunction(self):
        ---
        return J
    def backPropogate(self):
        ---
        return grad_back

我正在尝试使用scipy.optimize.minimize

调用这些函数
result = opt.minimize(Neural(params_init, X, y, 1).costFunction(), x0=params_init, method='CG',
                     jac=Neural(params_init, X, y, 1).backPropogate())

我一直在

  

具有多个元素的数组的真值是不明确的

我试过不用()调用函数,但我得到(这在我看来最正确):

  

init ()缺少1个必需的位置参数:' lambda1'

我尝试过使用这样的args:

result = opt.minimize(Neural.costFunction, x0=params_init, args=(X, y, 1), method='CG',
                     jac=Neural.backPropogate)

但args参数是为类的函数而不是对象本身识别的。如果我像这个Neural.costFunction()那样调用函数,我得到

  

缺少位置要求"自我"

1 个答案:

答案 0 :(得分:0)

您提供给minimize的功能应该采用x,形状类似x0的变量,以及您通过args传递的值。 minimize会在搜索时逐步执行各种x,但每次都会传递相同的*args

如果您将课程更改为:

class Neural:
    def __init__(self, X, y, lambda1):
        ---
    def costFunction(self, params):
        ---
        return J

您应该能够将其用作:

myobj = Neural(X, y, 1)
opt.minimize(myobj.costFunction, x0=params_init, method='CG',jac=myobj.backPropogate)

backPropogate需要进行类似的调整。

我会通过像

之类的电话来测试它
Neural(X, y, 1).costFunction(params_init)

使用args, costFunction needs to accept X,y,lambda1`,例如:

....
def costFunction(self, params, X, y, lambda1):

并使用Neural().costFunction创建。