【问题标题】:How do I approximate the Jacobian and Hessian of a function numerically?如何在数值上逼近函数的 Jacobian 和 Hessian?
【发布时间】:2012-12-13 08:19:09
【问题描述】:

我在 Python 中有一个函数:

def f(x):
    return x[0]**3 + x[1]**2 + 7 
    # Actually more than this.
    # No analytical expression

它是向量的标量值函数。

如何在 numpy 或 scipy 中数值近似此函数的 Jacobian 和 Hessian?

【问题讨论】:

  • 渐变有scipy.optimize.optimize.approx_fprime,很方便。

标签: numpy scipy numerical


【解决方案1】:

(在 2017 年底更新,因为这个领域有很多更新。)

您最好的选择可能是automatic differentiation。现在有很多包,因为它是深度学习的标准方法:

  • Autograd 透明地与大多数 numpy 代码一起工作。它是纯 Python,几乎不需要对典型函数进行代码更改,而且速度相当快。
  • 有许多面向深度学习的库可以做到这一点。 其中一些最受欢迎的是TensorFlowPyTorchTheanoChainerMXNet。每个都需要你用他们那种类似于 numpy 但不需要不同的 API 重写你的函数,作为回报,你会为你提供 GPU 支持和一堆你可能关心或不关心的面向深度学习的特性.
  • FuncDesigner 是一个我没有使用过的旧包,它的网站目前已关闭。

另一种选择是用finite differences 来近似它,基本上只是评估(f(x + eps) - f(x - eps)) / (2 * eps)(但显然比这要付出更多的努力)。与其他方法相比,这可能会更慢且准确性更低,尤其是在中等高度的情况下,但它是完全通用的,不需要更改代码。 numdifftools 似乎是这个的标准 Python 包。

您也可以尝试使用SymPy 找到完全符号化的导数,但这将是一个相对手动的过程。

【讨论】:

  • 很好的答案!快速更新:不再支持 Theano。
【解决方案2】:

仅限于 SciPy,我发现最方便的方法是 scipy.misc.derivative,在适当的循环中,使用 lambdas 来咖喱感兴趣的函数。

【讨论】:

  • AFAICT 这仅支持标量的标量函数?问题是关于向量的标量函数。
猜你喜欢
  • 2010-12-25
  • 2017-04-29
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多