简单的数值梯度的计算(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处的梯度。- 中心差分法 计算数值梯度,可用于无法直接求导的函数(比如复杂的黑盒函数)。
这段代码是数值计算中的 自动微分 及 优化算法(如梯度下降) 的基础,广泛用于 机器学习、神经网络训练、科学计算等。

浙公网安备 33010602011771号