我如何用函数逼近函数的雅可比和Hessian?

时间:2012-12-13 08:19:09

标签: numpy scipy numerical

我在Python中有一个函数:

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

它是向量的标量值函数。

我怎样才能在numpy或scipy数字上近似这个函数的雅可比和黑森呢?

2 个答案:

答案 0 :(得分:14)

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

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

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

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

你也可以尝试用SymPy找到完全符号的衍生物,但这是一个相对手动的过程。

答案 1 :(得分:1)

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