在python中提供一个hessian到fmin\ncg

2024-09-30 09:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

对于SciPy函数fmin_ncg,有没有一种方法可以将hessian和gradient作为变量而不是函数来提供?在

我试图用python重写一些Matlab代码。该代码涉及到使用优化例程将一些参数拟合到一组数据中。为此,我提供了梯度和黑森函数。E、 g在Matlab中我有这样的东西:

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

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

但是对于Python中的fmin_ncg,gradiant和hessian似乎必须作为单独的函数提供。在

对我来说,这似乎是低效的,因为代码必须经过一个大的数据集,并且有一些计算是函数、梯度和hessian函数所共有的。e、 想象一个函数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的工作原理,或者有什么方法可以解决这个问题?在


Tags: 数据方法函数代码参数scipymyfunc例程
1条回答
网友
1楼 · 发布于 2024-09-30 09:24:49

您可以创建一个包含所有函数的类。每次迭代时,在第一次函数调用期间计算公共变量,然后在其他调用中重用。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

你会这样用的。在

^{pr2}$

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

相关问题 更多 >

    热门问题