【模式识别与机器学习】L2 线性回归
·
线性回归【输出连续值或离散类别】
最小化平方损失
【损失函数】平方损失
ℓin(w)=1N∑n=1N(wTxn−yn)2ℓ_{in}(w)=\frac{1}{N}∑_{n=1}^N(w^Tx_n−y_n)^2ℓin(w)=N1∑n=1N(wTxn−yn)2,矩阵形式ℓin(w)=1N∥Xw−Y∥2ℓ_{in}(w)=\frac{1}{N}∥Xw−Y∥^2ℓin(w)=N1∥Xw−Y∥2
模型表达:h(x)=wTxh(x)=w^Txh(x)=wTx
1.线性回归算法(最小二乘法)
1)核心目标:最小化训练误差ℓin(w)ℓ_{in}(w)ℓin(w),求解最优权重w∗w^∗w∗。
2)步骤
- 对ℓin(w)ℓ_{in}(w)ℓin(w)求梯度并令其为 0,∇ℓin(w)=2NXT(Xw−Y)=0∇ℓ_{in}(w)=\frac{2}{N}X^T(Xw−Y)=0∇ℓin(w)=N2XT(Xw−Y)=0(矩阵形式)或者∇ℓin(w)=2N∑n=1N(wTxn−yn)xn∇ℓ_{in}(w)=\frac{2}{N}∑_{n=1}^{N}(w^Tx_n−y_n)x_n∇ℓin(w)=N2∑n=1N(wTxn−yn)xn
- 最优权重w∗=(XTX)−1XTY,其中w^*=(X^TX)^{−1}X^TY,其中w∗=(XTX)−1XTY,其中X†=(XTX)−1XTX^†=(X^TX)^{−1}X^TX†=(XTX)−1XT为X的广义逆(仅当XTX可逆时成立)
3)回归→分类:将回归输出w∗Txw^{∗T}xw∗Tx代入符号函数,即sign(w∗Tx)sign(w^{∗T}x)sign(w∗Tx)
2.梯度下降法(迭代优化)
适用:XTXX^TXXTX不可逆或样本维度高
【权重更新】:wt+1=wt−η∇ℓin(wt)w_{t+1}=w_t−η∇ℓ_{in}(w_t)wt+1=wt−η∇ℓin(wt) ,其中η为学习率(控制步长)
【关键变种算法】
| 算法 | 核心改进 | 权重更新公式(单参数wi) |
|---|---|---|
| 随机梯度下降(SGD) | 每次用 1 个样本计算梯度,速度快但波动大 | wi,t+1=wi,t−η(wtTxn−yn)xn,iw_{i,t+1}=w_{i,t}−η(w_tTx_n−y_n)x_{n,i}wi,t+1=wi,t−η(wtTxn−yn)xn,i(xn,i(x_{n,i}(xn,i为第n样本第i特征) |
| Adagrad | 自适应学习率,梯度大的参数步长小,梯度小的参数步长大 | wi,t+1=wi,t−∑k=0t(∂wi,k/∂ℓin)2+εη⋅∂wi,t/∂ℓinw_{i,t+1}=w_{i,t}−∑_{k=0}^t(∂w_{i,k}/∂ℓ_{in})^2+εη⋅∂w_{i,t}/∂ℓ_{in}wi,t+1=wi,t−∑k=0t(∂wi,k/∂ℓin)2+εη⋅∂wi,t/∂ℓin |
| RMSProp | 改进 Adagrad,用指数移动平均降低历史梯度影响,适合非平稳目标 | wi,t+1=wi,t−ασi,t−1/2+(1−α)(∂wi,t/∂ℓin)2+εη⋅∂wi,t/∂ℓinw_{i,t+1}=w_{i,t}−ασ_{i,t}^{−1/2}+(1−α)(∂w_{i,t}/∂ℓ_{in})^2+εη⋅∂w_{i,t}/∂ℓ_{in}wi,t+1=wi,t−ασi,t−1/2+(1−α)(∂wi,t/∂ℓin)2+εη⋅∂wi,t/∂ℓin(α=0.9) |
| 动量法 | 引入动量m,模拟物理惯性,加速收敛并抑制波动 | mi,t+1=λmi,t−η∂wi,t/∂ℓinm_{i,t+1}=λm_{i,t}−η∂w_{i,t}/∂ℓ_{in}mi,t+1=λmi,t−η∂wi,t/∂ℓin,wi,t+1=wi,t+mi,t+1w_{i,t+1}=w_{i,t}+m_{i,t+1}wi,t+1=wi,t+mi,t+1(λ=0.9) |
| Adam | 结合 RMSProp(自适应学习率)和动量法(惯性),加偏差修正 | mt=β1mt−1+(1−β1)∇ℓinm_t=β_1m_{t−1}+(1−β_1)∇ℓ_{in}mt=β1mt−1+(1−β1)∇ℓin,vt=β2vt−1+(1−β2)(∇ℓin)2v_t=β_2v_{t−1}+(1−β_2)(∇ℓ_{in})^2vt=β2vt−1+(1−β2)(∇ℓin)2,β1=0.9β_1=0.9β1=0.9,β2=0.999β_2=0.999β2=0.999,α=0.001α=0.001α=0.001,m^t=mt/(1−β1t)\hat m_t=m_t/(1−β_1t)m^t=mt/(1−β1t),v^t=vt/(1−β2t)\hat v_t=v_t/(1−β_2t)v^t=vt/(1−β2t) |
学习率η:过大会导致震荡不收敛,过小会导致收敛过慢
- SGD 与 BGD 对比:
- 批量梯度下降(BGD):用全部样本算梯度,更新稳定但速度慢
- 随机梯度下降(SGD):批量大小 = 1,速度快但波动大,可看作 “软性” 感知器
附录:
例:求最小平方误差和最佳解的算法(仅展示关键函数)
1.广义逆法
def least_squares (X, y):
# 添加偏置项
X_b = np.hstack([np.ones((X.shape[0], 1)), X])
X_T = X_b.T # 计算广义逆
w = np.linalg.pinv(X_T @ X_b) @ X_T @ y # 广义逆求解
return w
2.梯度下降法
def gradient_descent (X, y, learning_rate=0.01, epochs=10000, tol=1e-6):
n_samples, n_features = X.shape
X_b = np.hstack([np.ones((n_samples, 1)), X])
y = y.reshape(-1, 1) # 转为列向量
w = np.random.randn(n_features + 1, 1)
losses = []
for epoch in range(epochs):
y_pred = X_b @ w # 计算预测值和损失
loss = np.mean((y_pred - y)**2) /
losses.append(loss)
gradient = (X_b.T @ (y_pred- y)) / n_samples
w_new = w - learning_rate * gradient
if np.linalg.norm(w_new - w) < tol:
w = w_new# 检查是否收敛
break
w = w_new
return w.flatten(), losses
更多推荐

所有评论(0)