使用 scipy 最小化二参数函数时的性能问题

A performance concern when using minimizing a two-parameter function with scipy

我有一个 2 参数 python 函数

def foo(x,y):
          // a numeric operation that returns a double

我需要使用 scipy.optimize.minimize 来定位一个点附近的 f 的最小点,比如 (1.2, 3.4)

我试过

scipy.optimize.minimize(foo, (1.2, 3.4))

scipy.optimize.minimize(foo, [1.2, 3.4])

scipy.optimize.minimize(foo, *[1.2,3.4])

None 有效,产生

TypeError: function takes exactly 2 arguments (1 given)

所以我唯一的解决方案似乎是包装函数,例如

scipy.optimize.minimize(lambda X:foo(*X), [1.2,3.4]),

最后一个可行,但我担心带有 lambda 项的额外层会引入不必要的时间开销。因为我的应用程序对性能高度敏感,所以我要求一个有效的解决方案让 scipy.optimize.minimize 接受 foo 的输入对,而没有潜在的时间开销。任何的想法?谢谢。

您应该根据单个(可能是多维)参数定义您的函数。因此你不使用

def foo(x,y):
      // a numeric operation that returns a double

而是

def foo(x):
      // use x[0] in place of original x
      // and x[1] in place of original y

例如 f(x,y) = x + y^2 你使用

def foo(x):
    return x[0] + x[1] ** 2

如果不允许修改 foo 那么你可以随时用另一个函数将其包裹起来

def foowrap(x):
   return foo(x[0], x[1])

这应该比将列表展开到位置参数(* 运算符)更有效

只是为了测试

>>> timeit.timeit('foowrap([1,2])', setup='from __main__ import foowrap', number=10000000)
5.230706214904785    
>>> timeit.timeit('foo([1,2])', setup='from __main__ import foo', number=10000000) # this is your lambda term
5.379893779754639

如此小的加速,但确实如此。