目前我有以下代码定义函数f
。
a = #something
b = #something
c = #something
def f(x):
"""Evaluates some function that depends on parameters a, b, and c"""
someNumber = #some calculation
return someNumber
理想情况下我会做def f(x, a, b, c)
,但是我在f
方面最小化x
,而SciPy的优化工具箱不允许最小化参数中带参数的函数。这就是说我想为a, b
和c
的多个值运行我的最小化代码。有没有办法可以做到这一点?
答案 0 :(得分:13)
您可以在args
from scipy.optimize import minimize
minimize(f, x0, args=(a, b, c))
答案 1 :(得分:3)
这是关于使用minimize
的简单问题和答案。如果其他用户需要更具体的东西,这是一个简单的例子。
广义二次方程:
In [282]: def fun(x, a,b,c):
...: return a*x**2 + b*x + c
In [283]: optimize.minimize(fun, 10, args=(1,0,0))
Out[283]:
fun: 1.7161984122524196e-15
hess_inv: array([[ 0.50000001]])
jac: array([ -6.79528891e-08])
message: 'Optimization terminated successfully.'
nfev: 15
nit: 4
njev: 5
status: 0
success: True
x: array([ -4.14270251e-08])
In [284]: optimize.minimize(fun, 10, args=(1,1,1))
Out[284]:
fun: 0.7500000000000221
hess_inv: array([[ 0.49999999]])
jac: array([ 3.12924385e-07])
message: 'Optimization terminated successfully.'
nfev: 12
nit: 2
njev: 4
status: 0
success: True
x: array([-0.49999985])
该函数也可以将数组作为输入,但仍需要返回单个(标量)值:
In [289]: optimize.minimize(fun, [10,10,10], args=(np.array([1,2,3]), 1, 1))
Out[289]:
fun: 2.541666666667115
hess_inv: array([[ 0.50021475, -0.00126004, 0.00061239],
[-0.00126004, 0.25822101, -0.00259327],
[ 0.00061239, -0.00259327, 0.16946887]])
jac: array([ -8.94069672e-08, 4.47034836e-07, -2.20537186e-06])
message: 'Optimization terminated successfully.'
nfev: 55
nit: 9
njev: 11
status: 0
success: True
x: array([-0.50000006, -0.2499999 , -0.16666704])
In [286]: def fun(x, a,b,c):
...: return (a*x**2 + b*x + c).sum()
确保函数与建议的x0
和args一起运行是个好主意,例如
In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1)
Out[291]: 633
如果您无法调用目标函数,或者对其参数的工作方式感到困惑,minimize
并不是一个神奇的子弹。这种最小化仅与您对目标函数的理解一样好。