带参数的最小化函数

24

目前我有以下代码,定义了函数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,bc的值。有没有办法可以做到这一点?


3
使用functools.partial根据特定的a、b、c值“冻结”函数? - PM 2Ring
@PM2Ring 这个方法可行,我很高兴现在知道了这个工具,但正如 @Liteye 指出的那样,minimize 实际上允许我传递参数。谢谢! - Nate Stemen
1
不用担心。当需要时,partial 是很好的选择,但我不熟悉 SciPy,所以只是一个建议。显然,Liteye 的回答才是正确的方式。 :) - PM 2Ring
2个回答

36

您可以在args中指定其他参数。

from scipy.optimize import minimize 
minimize(f, x0, args=(a, b, c))

3
在函数f的参数中,args中的参数是否需要与函数体中调用它们的方式相同?f函数本身是否仍然为f(x),还是变成了f(x,a,b,c) - Robb1

17

这是一个有关使用 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和参数运行是个好主意,例如:

In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1)
Out[291]: 633

如果您不能调用目标函数,或者对其参数的工作方式感到困惑,那么minimize并不是一个万能药。这种最小化只有在您理解目标函数的基础上才有效。


抱歉挖出一个旧答案,但我认为另一个问题可能是重复的。您如何添加一个约束,它取决于最小化变量x和其中一个参数a。我有一个类似的问题,额外的约束是x + a < 1。 - user1936752
@user1936752,我认为限制条件被称为与目标函数相同的参数调用,即(x,) + args(元组连接)。因此,它们必须具有相同的签名,或者至少是兼容的。 - hpaulj
感谢您的评论。也许我没有能够正确表达我的问题,所以我在这里提出了一个单独的问题:https://dev59.com/plQJ5IYBdhLWcg3wFxx_。如果您有时间看一下,我将不胜感激! - user1936752

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接