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

nic*_*ine 9 numerical numpy scipy

我有一个Python函数:

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

它是向量的标量值函数.

我怎样才能在numpy或scipy数字上近似Jacobian和Hessian这个函数?

Dou*_*gal 14

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

你最好的选择可能是自动分化.现在有很多软件包,因为它是深度学习的标准方法:

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

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

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