如何用Python、NumPy计算n维函数F(x)=sum(x²)的梯度?
计算n维函数F(x)=sum(x²)的梯度
数学原理
函数F(x) = Σ(xᵢ²)(i从1到n),对每个分量xᵢ求偏导可得:∂F/∂xᵢ = 2xᵢ。因此梯度向量∇F(x)是一个n维向量,每个元素对应原向量x对应元素的2倍,即∇F(x) = 2x。
代码实现
方法1:纯Python手动遍历
适合理解底层逻辑,逐个计算梯度分量:
def compute_gradient(x): # x为列表/元组形式的n维向量 gradient = [] for xi in x: gradient.append(2 * xi) return gradient # 示例 x = [1, 2, 3, 4] print(compute_gradient(x)) # 输出: [2, 4, 6, 8]
方法2:用NumPy高效计算
处理高维向量时更简洁高效,利用向量广播运算:
import numpy as np def compute_gradient_np(x): # x为NumPy数组形式的n维向量 return 2 * x # 示例 x = np.array([1, 2, 3, 4]) print(compute_gradient_np(x)) # 输出: [2 4 6 8]
验证梯度正确性
可以通过数值梯度近似验证解析梯度的准确性,数值梯度用(F(x+εeᵢ) - F(x-εeᵢ))/(2ε)近似偏导(ε取极小值,比如1e-5):
def numerical_gradient(x, epsilon=1e-5): n = len(x) grad = np.zeros(n) for i in range(n): x_plus = x.copy() x_plus[i] += epsilon f_plus = np.sum(x_plus ** 2) x_minus = x.copy() x_minus[i] -= epsilon f_minus = np.sum(x_minus ** 2) grad[i] = (f_plus - f_minus) / (2 * epsilon) return grad # 对比解析梯度与数值梯度 x = np.array([1.5, 2.2, 3.7]) analytic_grad = compute_gradient_np(x) numeric_grad = numerical_gradient(x) print("解析梯度:", analytic_grad) print("数值梯度:", numeric_grad) # 输出几乎一致,误差在ε量级
内容的提问来源于stack exchange,提问作者jenjen
相关产品推荐
相关产品推荐

