共计 1265 个字符,预计需要花费 4 分钟才能阅读完成。
线性回归核心概念
线性回归通过拟合线性方程 $y = \theta^T X$ 预测连续值,其核心是最小化均方误差 $J(\theta)=\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2$。

常见实现痛点
- 梯度下降收敛慢:学习率过大导致震荡,过小则收敛耗时
- 特征尺度差异:未归一化的特征会延长优化路径
- 数值溢出风险:迭代过程中可能出现指数级数值增长
完整代码实现
import numpy as np
class LinearRegression:
def __init__(self, alpha=0.01, n_iter=1000):
self.alpha = alpha # 学习率
self.n_iter = n_iter # 迭代次数
self.theta = None # 参数向量
self.loss_history = [] # 损失记录
def _feature_scaling(self, X):
'''特征标准化(Z-score 归一化)'''
self.mean = np.mean(X, axis=0)
self.std = np.std(X, axis=0)
return (X - self.mean) / (self.std + 1e-8) # 防止除零
def fit(self, X, y):
'''训练模型'''
m = X.shape[0]
X = self._feature_scaling(np.c_[np.ones(m), X]) # 添加偏置项
y = y.reshape(-1, 1)
self.theta = np.zeros((X.shape[1], 1))
for _ in range(self.n_iter):
h = X.dot(self.theta)
loss = (1/(2*m)) * np.sum((h - y)**2)
self.loss_history.append(loss)
# 梯度下降核心实现
gradient = (1/m) * X.T.dot(h - y)
self.theta -= self.alpha * gradient
def predict(self, X):
'''预测新样本'''
X = (np.c_[np.ones(X.shape[0]), X] - self.mean) / (self.std + 1e-8)
return X.dot(self.theta)
性能优化技巧
- 动态学习率:实现学习率衰减策略,如
alpha = alpha0 / (1 + decay_rate * epoch) - 早停机制:当连续 10 次迭代损失下降小于阈值时终止训练
- 批量梯度下降改进 :可改用随机梯度下降(SGD) 或小批量梯度下降
避坑指南
- 特征工程:
- 删除多重共线性特征(方差膨胀因子 >10)
- 对偏态分布特征进行对数变换
- 数值稳定:
- 添加 1e- 8 防止除零
- 使用 np.clip 限制梯度范围
实际应用建议
- 评估指标:
- 计算 R²得分:
1 - RSS/TSS - 绘制学习曲线判断欠 / 过拟合
- 超参数调优:
- 使用网格搜索确定最佳学习率
- 通过交叉验证选择正则化系数
思考题
- 当特征维度远大于样本量时,应该如何改进算法?
- 如何证明梯度下降获得的解是全局最优而非局部最优?
- 在线性回归中引入 L2 正则化后,梯度下降公式会发生什么变化?
正文完
发表至: 未分类
近三天内
