我在Python中有一个函数:
def f(x):
return x[0]**3 + x[1]**2 + 7
# Actually more than this.
# No analytical expression
它是向量的标量值函数。
我怎样才能在numpy或scipy数字上近似这个函数的雅可比和黑森呢?
答案 0 :(得分:14)
(2017年末更新,因为这个领域有很多更新。)
你最好的选择可能是automatic differentiation。现在有很多软件包,因为它是深度学习的标准方法:
另一种选择是使用finite differences来近似它,基本上只是评估(f(x + eps) - f(x - eps)) / (2 * eps)
(但显然需要付出更多的努力)。这可能比其他方法更慢,更准确,特别是在中等高度方面,但是完全通用,不需要更改代码。 numdifftools
似乎是标准的Python包。
你也可以尝试用SymPy
找到完全符号的衍生物,但这是一个相对手动的过程。
答案 1 :(得分:1)
仅限于SciPy,我发现最方便的方法是scipy.misc.derivative,在适当的循环中,用lambdas来理解感兴趣的功能。