我可以将目标和派生函数传递给scipy.optimize.minimize作为一个函数吗?

时间:2014-05-01 23:18:57

标签: python scipy neural-network mathematical-optimization

我正在尝试使用scipy.optimize.minimize来最小化复杂的功能。事后我注意到minimize函数将目标函数和派生函数作为单独的参数。不幸的是,我已经定义了一个函数,它将目标函数值和一阶导数值一起返回 - 因为这两个函数在for循环中同时计算。我不认为有一个很好的方法可以将我的函数分成两个,而程序基本上不会运行相同的for循环两次。

有没有办法将这个组合函数传递给minimize

(仅供参考,我正在编写人工神经网络反向传播算法,因此for循环用于循环训练数据。目标和衍生物同时累积。)

2 个答案:

答案 0 :(得分:3)

是的,你可以在一个函数中传递它们:

import numpy as np
from scipy.optimize import minimize

def f(x):
    return np.sin(x) + x**2, np.cos(x) + 2*x

sol = minimize(f, [0], jac=True, method='L-BFGS-B')

答案 1 :(得分:1)

可能有用的东西是:你可以记住这个函数,这意味着如果第二次使用相同的输入调用它,它将只返回与这些输入相对应的相同输出,而不是第二次进行任何实际工作。幕后发生的事情是结果被缓存。在非线性程序的上下文中,可能有数千个调用意味着大缓存。通常使用memoizers(?),您可以指定缓存限制,并且群体将被管理FIFO。 Iow你仍然可以完全受益于你的特定情况,因为只有当你需要在同一时间点返回函数值和导数时,输入才会相同。所以我得到的是一个小缓存就足够了。

您不会说您是使用py2还是py3。在Py 3.2+中,您可以使用functools.lru_cache作为装饰器来提供此备忘录。然后,你编写这样的代码:

@functools.lru_cache
def original_fn(x):
   blah
   return fnvalue, fnderiv

def new_fn_value(x):
   fnvalue, fnderiv = original_fn(x)
   return fnvalue

def new_fn_deriv(x):
   fnvalue, fnderiv = original_fn(x)
   return fnderiv

然后将每个新函数传递给minimize。由于第二次调用,您仍然会受到惩罚,但如果x未更改,则无效。 需要研究未更改在浮点数上下文中的含义,特别是因为x的变化会随着最小化开始收敛而消失。

如果你仔细观察,py2.x中有很多记忆的配方。

我有没有任何意义?