使用 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
如此小的加速,但确实如此。
我有一个 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
如此小的加速,但确实如此。