【问题标题】:Using scipy to minimize a function that also takes non variational parameters使用 scipy 最小化一个也采用非变分参数的函数
【发布时间】:2014-10-02 02:37:46
【问题描述】:

我想使用scipy.optimize 模块来最小化一个函数。假设我的函数是f(x,a):

def f(x,a):
 return a*x**2

对于固定的a,我想相对于x 最小化f(x,a)

使用scipy,我可以导入例如fmin 函数(我有一个旧的scipy:v.0.9.0),给出一个初始值x0,然后优化(documentation):

from scipy.optimize import fmin
x0 = [1]
xopt = fmin(f, x0, xtol=1e-8)

失败是因为f 接受两个参数,而fmin 只传递一个(实际上,我什至还没有定义a)。如果我这样做:

from scipy.optimize import fmin
x0 = [1]
a = 1
xopt = fmin(f(x,a), x0, xtol=1e-8)

计算也将失败,因为“x 未定义”。但是,如果我定义x,则没有可优化的变分参数。

这里如何允许非可变参数用作函数参数?

【问题讨论】:

    标签: python numpy scipy mathematical-optimization minimization


    【解决方案1】:

    对于您的情况,Warren 的规范解决方案可能是正确的选择。

    然而,值得注意的是,您还可以优化类的成员函数。在这种情况下,您可以访问可用作参数的类变量。如果您的代码已经是基于对象的并且添加成员函数进行优化是有意义的,这将特别有用。

    在您的示例中,这个(过度杀伤)解决方案是:

    class FunctionHolder(object):
        def __init__(self,a):
            self.a=a
        def f(self, x):
            return x*self.a
    
    f1=FunctionHolder(1)
    scipy.optimize.minimize(f1.f, x0)
    

    【讨论】:

      【解决方案2】:

      args 参数在这里可能是正确的方法,但这里还有另一种有时很有用的方法。首先,您为 f 编写一个包装函数,它将一个函数和一个值作为输入,并返回一个新函数,其中 a 是固定的。

      def fix_a(f, a):
          def f_with_fixed_a(x):
              return f(x, a)
      return f_with_fixed_a
      

      然后你可以这样调用 fmin:

      xopt = fmin(fix_a(f, a), x0, xtol=1e-8)
      

      如果你只需要传入一个固定的a,使用 fmin 的args 关键字这可能过于冗长,但这种方法更灵活,可以处理更复杂的情况(例如,如果你想做ax的一些功能)。

      【讨论】:

      • 谢谢,这是一个不错的解决方案。对于我的具体问题,上面的“规范”解决方案就足够了。
      【解决方案3】:

      在其文档字符串中了解fminargs 参数,并使用

      a = 1
      x0 = 1
      xopt = fmin(f, x0, xtol=1e-8, args=(a,))
      

      【讨论】:

      • 谢谢,这解决了问题。不知何故,我错过了 args 关键字。
      猜你喜欢
      • 2016-07-22
      • 2019-03-21
      • 2018-01-30
      • 2015-02-18
      • 1970-01-01
      • 2021-10-25
      • 2020-11-25
      • 2019-03-21
      相关资源
      最近更新 更多