【问题标题】:Suppyling a hessian to fmin_ncg in python在 python 中为 fmin_ncg 提供粗麻布
【发布时间】:2011-09-27 18:28:21
【问题描述】:

对于 SciPy 函数 fmin_ncg,有没有办法将 hessian 和梯度作为变量而不是函数提供?

我正在尝试用 python 重写一些 Matlab 代码。该代码涉及使用优化例程将一些参数拟合到一组数据。为此,我提供了渐变和粗麻布。例如在 Matlab 中我有这样的东西:

fmincon(@myFunc,x0,[],[],[],[],lb,ub,[],options);

其中myFunc 返回 3 个值:函数求值、梯度和 hessian。

但是对于 Python 中的 fmin_ncg,似乎必须将梯度和粗麻布作为单独的函数提供。

对我来说,这似乎效率低下,因为代码必须经过一个大型数据集,并且函数、梯度和粗麻布有一些共同的计算。例如想象一个函数f(x) = a(x)*b(x),渐变为g(x) = a(x)*c(x),hessian h(x) = a(x)*d(x) ...在Matlab中我可以计算一次a(x),而看起来我必须在python中计算三次。

我是否误解了fmin_ncg 的工作原理,或者有没有办法解决这个问题?

【问题讨论】:

    标签: python matlab numpy scipy mathematical-optimization


    【解决方案1】:

    您可以创建一个包含所有功能的类。每次迭代,在第一次函数调用期间计算公共变量,然后在其他调用中重用。 fmin_ncg的回调功能可用于在每次迭代结束时重置公共变量。

    class function(object):
    
       def __init__(self):
          self.commonVarsDirty = True
    
       def calcFunction(self,x,*args,**kwargs):
          if self.commonVarsDirty:
             self.calcCommonVars()
          return self.a*b
    
       def calcGradient(self,x,*args,**kwargs):
          if self.commonVarsDirty:
             self.calcCommonVars()
          return self.a*c
    
       def calcHessian(self,x,*args,**kwargs):
          if self.commonVarsDirty:
             self.calcCommonVars()
          return self.a*d
    
       def resetCommonVars(self,*args,**kwargs):
          self.commonVarsDirty = True
    
       def calcCommonVars(self):
          self.commonVarsDirty = False
          # calculate common variables and save them as class attributes
          self.a = 1+1
    

    你会这样使用它。

    f = function()
    fmin_ncg(f.calcFunction,x0,f.calcGradient,fhess=f.calcHessian,callback=f.resetCommonVars)
    

    这会增加一些开销,因此只有在计算公共变量的计算工作量很大时才值得。

    【讨论】:

      猜你喜欢
      • 2017-07-18
      • 2016-05-02
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多