分享
三行代码  ›  专栏  ›  技术社区  ›  Jae Woo Kim

似乎numpy数组会自动忽略小数

  •  0
  • Jae Woo Kim  · 技术社区  · 5 天前

    似乎numpy数组会自动忽略delta_x。下面的梯度向量的输出是巨大的。下面的梯度代码应该做什么修改?

    import copy
    import numpy as np
    
    def numerical_gradient(f, x):
        delta_x = 1e-7    # 0.0000001
        gradient = np.zeros_like(x)    # Return an array of zeros with the same shape
    
        for i in range(x.size): 
            # constructs a new compound object and then, recursively, 
            # inserts copies into it of the objects found in the original
            _x1 = copy.deepcopy(x)    
            _x1[i] = x[i] + delta_x
            _y1 = f(_x1)    # f(x + delta_x)
    
            _x2 = copy.deepcopy(x)
            _x2[i] = x[i] - delta_x
            _y2 = f(_x2)    # f(x - delta_x)
    
            gradient[i] = (_y1 - _y2) / (delta_x*2)
        return gradient
    
    def f(x):
        y = x[0]**2 + x[1]**2
        return y
    
    numerical_gradient(f,np.array([3,3]))
    
    1 回复  |  直到 5 天前
        1
  •  1
  •   Han-Kwang Nienhuys    5 天前

    问题在于:

    numerical_gradient(f,np.array([3,3]))
    

    deepcopy zeros_like

    如果您这样做:

    numerical_gradient(f,np.array([3.0, 3.0]))