import numpy as np
# 1. 使用官方推荐的 Generator 设置固定随机种子
rng = np.random.default_rng(seed=42)
# 2. 构造特征尺寸悬殊的数据集 (x1 范围 1 左右,x2 范围 100 左右)
N = 200
x1 = rng.normal(1.0, 0.5, N)
x2 = rng.normal(100.0, 20.0, N)
X_unscaled = np.column_stack([x1, x2])
y = 2.0 * x1 + 0.05 * x2 + rng.normal(0, 0.1, N)
# 标准化特征 Z-score
X_scaled = (X_unscaled - np.mean(X_unscaled, axis=0)) / np.std(X_unscaled, axis=0)
# 3. 批量梯度下降 (BGD) 训练函数
def train_bgd(X: np.ndarray, y: np.ndarray, lr: float = 0.01, epochs: int = 50):
m, n = X.shape
w = np.zeros(n)
losses = []
for _ in range(epochs):
pred = X @ w
loss = np.mean((pred - y) ** 2)
grad = (2.0 / m) * X.T @ (pred - y)
w -= lr * grad
losses.append(loss)
return w, losses
# 运行对比实验
w_unscaled, loss_unscaled = train_bgd(X_unscaled, y, lr=1e-5, epochs=20)
w_scaled, loss_scaled = train_bgd(X_scaled, y, lr=0.1, epochs=20)
print("未标准化数据 - 第1次 Loss:", np.round(loss_unscaled[0], 2), "-> 第20次 Loss:", np.round(loss_unscaled[-1], 2))
print("标准化数据 - 第1次 Loss:", np.round(loss_scaled[0], 2), "-> 第20次 Loss:", np.round(loss_scaled[-1], 2))