简单的数值梯度的计算(python)

python 实现简单数值梯度

import numpy as np

def f2(x):
    return np.sum(x ** 2)

def grad(f, x):
    h = 1e-4
    g = np.zeros_like(x)
    for i in range(x.size):
        tmp = x[i]
        x[i] = tmp + h
        fxh1 = f(x)
        x[i] = tmp - h
        fxh2 = f(x)
        x[i] = tmp
        g[i] = (fxh1 - fxh2) / (2 * h)
    return g
grad(f2, np.array([3.0, 4.0]))
输出:array([6., 8.])

这段 Python 代码实现了 数值梯度(Numerical Gradient) 的计算。让我们逐步解析其功能和工作原理。


代码解读

import numpy as np

导入 NumPy 库,以便进行数组运算。


函数 1:f2(x)

def f2(x):
    return np.sum(x ** 2)

功能:

  • 计算输入 x 的所有元素的平方和,即:
    [
    f(x) = \sum x_i^2
    ]
  • 例如:
    x = np.array([1.0, 2.0, 3.0])
    print(f2(x))  # 输出 1² + 2² + 3² = 14
    

函数 2:grad(f, x)

def grad(f, x):
    h = 1e-4
    g = np.zeros_like(x)
  • h = 1e-4:微小的变化量(即 有限差分 的步长)。
  • g = np.zeros_like(x):创建一个与 x 形状相同的零数组,用于存储梯度。

核心部分:计算数值梯度
for i in range(x.size):
    tmp = x[i]      # 备份 x[i]
    x[i] = tmp + h  # x[i] 增加 h
    fxh1 = f(x)     # 计算 f(x+h)
    
    x[i] = tmp - h  # x[i] 减少 h
    fxh2 = f(x)     # 计算 f(x-h)
    
    x[i] = tmp      # 还原 x[i]
    
    g[i] = (fxh1 - fxh2) / (2 * h)  # 计算梯度

这里实现的是 中心差分法 计算梯度:
[
g_i = \frac{f(x+h) - f(x-h)}{2h}
]

  • 作用:数值逼近函数 f(x)x[i] 处的偏导数。
  • 恢复 x[i] 的原值:避免影响下一轮计算。

示例计算

x = np.array([3.0, 4.0])
g = grad(f2, x)
print(g)

计算过程:

  • x[0] = 3.0 计算:
    [
    g_0 = \frac{f([3.0001, 4]) - f([2.9999, 4])}{2 \times 10^{-4}}
    ]
  • x[1] = 4.0 计算:
    [
    g_1 = \frac{f([3, 4.0001]) - f([3, 3.9999])}{2 \times 10^{-4}}
    ]

最终结果:

[6. 8.]  # 真实梯度应为 [2x0, 2x1] = [6, 8]

总结

  • f2(x) 计算平方和函数 ( f(x) = \sum x_i^2 )。
  • grad(f, x) 使用 数值微分 方法计算 f(x)x 处的梯度。
  • 中心差分法 计算数值梯度,可用于无法直接求导的函数(比如复杂的黑盒函数)。

这段代码是数值计算中的 自动微分优化算法(如梯度下降) 的基础,广泛用于 机器学习、神经网络训练、科学计算等

posted @ 2025-03-12 16:34  立体风  阅读(124)  评论(0)    收藏  举报