numpy second derivative of a ndimensional array

前端 未结 3 2085
Happy的楠姐
Happy的楠姐 2021-01-31 10:42

I have a set of simulation data where I would like to find the lowest slope in n dimensions. The spacing of the data is constant along each dimension, but not all the same (I co

3条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-31 11:21

    You can see the Hessian Matrix as a gradient of gradient, where you apply gradient a second time for each component of the first gradient calculated here is a wikipedia link definig Hessian matrix and you can see clearly that is a gradient of gradient, here is a python implementation defining gradient then hessian :

    import numpy as np
    #Gradient Function
    def gradient_f(x, f):
      assert (x.shape[0] >= x.shape[1]), "the vector should be a column vector"
      x = x.astype(float)
      N = x.shape[0]
      gradient = []
      for i in range(N):
        eps = abs(x[i]) *  np.finfo(np.float32).eps 
        xx0 = 1. * x[i]
        f0 = f(x)
        x[i] = x[i] + eps
        f1 = f(x)
        gradient.append(np.asscalar(np.array([f1 - f0]))/eps)
        x[i] = xx0
      return np.array(gradient).reshape(x.shape)
    
    #Hessian Matrix
    def hessian (x, the_func):
      N = x.shape[0]
      hessian = np.zeros((N,N)) 
      gd_0 = gradient_f( x, the_func)
      eps = np.linalg.norm(gd_0) * np.finfo(np.float32).eps 
      for i in range(N):
        xx0 = 1.*x[i]
        x[i] = xx0 + eps
        gd_1 =  gradient_f(x, the_func)
        hessian[:,i] = ((gd_1 - gd_0)/eps).reshape(x.shape[0])
        x[i] =xx0
      return hessian
    

    As a test, the Hessian matrix of (x^2 + y^2) is 2 * I_2 where I_2 is the identity matrix of dimension 2

提交回复
热议问题