标准回答
线性回归用梯度下降最小化均方误差。前向计算预测 ŷ=Xw+b,残差 (ŷ−y) 既出现在损失里也出现在梯度里:对权重的梯度是 (2/N)·Xᵀ·残差,对偏置是残差的均值的两倍。每步沿负梯度方向更新参数。注意特征标准化能让损失曲面更接近各向同性,使统一学习率更易收敛。实现如下:
python
import numpy as np
def linear_regression_gd(X, y, lr=0.01, epochs=1000):
"""ŷ = Xw + b,最小化 MSE,全程向量化。"""
N, D = X.shape
w = np.zeros(D) # 权重初始化为 0
b = 0.0 # 偏置
for _ in range(epochs):
y_hat = X @ w + b # 前向:预测值
residual = y_hat - y # 残差 (ŷ - y)
# 梯度(MSE 对 w、b 求导,系数 2/N)
dw = (2 / N) * (X.T @ residual)
db = (2 / N) * residual.sum()
# 参数更新:沿负梯度方向
w -= lr * dw
b -= lr * db
return w, b
def mse(X, y, w, b):
return float(np.mean((X @ w + b - y) ** 2))
if __name__ == '__main__':
rng = np.random.default_rng(0)
X = rng.normal(0, 1, (200, 3))
true_w, true_b = np.array([2.0, -1.0, 0.5]), 3.0
y = X @ true_w + true_b + rng.normal(0, 0.1, 200) # 含噪声
w, b = linear_regression_gd(X, y, lr=0.1, epochs=2000)
print('w=', np.round(w, 2), 'b=', round(b, 2)) # 接近真值
print('mse=', round(mse(X, y, w, b), 4))常见误区
⚠️ 常见踩坑
MSE 梯度的系数是 2/N,漏掉常数 2 不影响最终解但相当于改变有效学习率;更常见的错误是忘记标准化特征导致不同维度梯度量级悬殊、学习率难统一,或把学习率设得过大使损失发散为 NaN。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。