10

我在 Python 中有一个函数:

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

它是向量的标量值函数。

如何在数字上以 numpy 或 scipy 近似此函数的 Jacobian 和 Hessian?

4

2 回答 2

16

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

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

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

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

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

于 2012-12-13T09:03:10.447 回答
1

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

于 2016-10-28T09:33:19.697 回答