我在 Python 中有一个函数:
def f(x):
return x[0]**3 + x[1]**2 + 7
# Actually more than this.
# No analytical expression
它是向量的标量值函数。
如何在数字上以 numpy 或 scipy 近似此函数的 Jacobian 和 Hessian?
(在 2017 年底更新,因为这个领域有很多更新。)
您最好的选择可能是自动区分。现在有很多包,因为它是深度学习的标准方法:
另一种选择是用有限差分来近似它,基本上只是评估(f(x + eps) - f(x - eps)) / (2 * eps)
(但显然付出了更多的努力)。与其他方法相比,这可能会更慢且准确性更低,尤其是在中等高度的情况下,但它是完全通用的,不需要更改代码。numdifftools
似乎是为此的标准 Python 包。
您也可以尝试使用 找到完全符号导数SymPy
,但这将是一个相对手动的过程。
仅限于 SciPy,我发现最方便的方法是scipy.misc.derivative,在适当的循环中,使用 lambdas 来咖喱感兴趣的功能。