【模式识别与机器学习】L4 Logistic回归与非线性变换
·
一、Logistic回归
Logistic回归(软回归)
输出样本属于“+1”类的概率
【核心函数】sigmoid函数 θ(s)=11+e−s\theta(s)=\frac{1}{1+e^{-s}}θ(s)=1+e−s1
【损失函数】交叉熵损失
- 单个样本损失ln=ln(1+exp(−ynwTxn))l_n=ln(1+exp(-y_nw^Tx_n))ln=ln(1+exp(−ynwTxn)),令zn=−ynwTxnz_n=-y_nw^Tx_nzn=−ynwTxn
- 单个样本∇ℓn(w)=θ(−ynwTxn)(−ynxn)∇ℓ_n(w)=\theta(-y_nw^Tx_n)(-y_nx_n)∇ℓn(w)=θ(−ynwTxn)(−ynxn)
- 整体梯度:∇ℓn(w)=1N∑n=1Nθ(−ynwTxn)(−ynxn)∇ℓ_n(w)=\frac{1}{N}∑_{n=1}^N\theta(-y_nw^Tx_n)(-y_nx_n)∇ℓn(w)=N1∑n=1Nθ(−ynwTxn)(−ynxn)
【步骤】
- 初始化权向量w0w_0w0,计算梯度∇ℓin(wt)∇ℓ_{in}(w_t)∇ℓin(wt)
- 参数更新:wt+1=wt−η⋅∇ℓin(wt)w_{t+1}=w_t-η⋅∇ℓ_{in}(w_t)wt+1=wt−η⋅∇ℓin(wt)
- 输出y^n=h(xn)=θ(wTxn)=11+e−wTxn\hat y_n=h(x_n)=\theta (w^Tx_n)=\frac{1}{1+e^{-w^Tx_n}}y^n=h(xn)=θ(wTxn)=1+e−wTxn1
【与其他线性模型对比】
| 模型 | 损失函数 | 优点 | 不足 |
|---|---|---|---|
| 感知器 | 0/1 损失 | 线性可分时收敛有理论保障 | 线性不可分则 NP 难 |
| 线性回归 | 平方损失 | 凸函数,有解析解,易优化 | ∣ywTx∣大时泛化差 |
| 逻辑斯蒂回归 | 交叉熵损失 | 凸函数,易优化,泛化性较好 | 极端样本时上界宽松 |
二、非线性变换(为SVM做铺垫)
1.维度 d维原始样本,经过Q次多项式变换后维度:d~=(Q+dQ)=(Q+d)!Q!⋅d!\widetilde d=\binom{Q+d}{Q}=\frac{(Q+d)!}{Q!⋅d!}d=(QQ+d)=Q!⋅d!(Q+d)!(有放回的组合问题)
2.VC维:衡量模型复杂度
- 样本数N越大、VC 维dvcd_{vc}dvc越小,训练误差与测试误差的差异越小,泛化能力越强
- dvcd_{vc}dvc↑:模型复杂度↑,EinE_{in}Ein↓,但泛化误差边界Ω↑,易过拟合
- dvcd_{vc}dvc↓:模型复杂度↓,Ω↓,但EinE_{in}Ein↑,易欠拟合
- EinE_{in}Ein小代表训练效果好,EoutE_{out}Eout大代表测试效果差
3.正则化——平衡训练误差与模型复杂度:在损失函数中加入参数惩罚项
- 公式:minwEaug(w)=Ein(w)+λNwTwmin_wE_{aug}(w)=E_{in}(w)+\frac{λ}{N}w^TwminwEaug(w)=Ein(w)+NλwTw
附录:
Logistic回归关键代码
class LogisticRegression:
def __init__(self, learning_rate=0.01, batch_size=32, epochs=100):
self.learning_rate = learning_rate
self.batch_size = batch_size
self.epochs = epochs
self.weights = None # 核心参数:权重(含偏置)
# Sigmoid激活函数(简化版)
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
# 添加偏置项
def add_bias(self, X):
return np.hstack([X, np.ones((X.shape[0], 1))])
# 核心:计算交叉熵损失(评估模型)
def compute_loss(self, X, y):
y_pred = self.sigmoid(np.dot(X, self.weights))
epsilon = 1e-10 # 避免log(0)
loss = -np.mean(y * np.log(y_pred + epsilon) + (1 - y) * np.log(1 - y_pred + epsilon))
return loss
# 梯度下降(参数更新)
def gradient_descent(self, X, y):
n_samples = X.shape[0]
y_pred = self.sigmoid(np.dot(X, self.weights))
gradient = np.dot(X.T, (y_pred - y)) / n_samples # 平均梯度
self.weights -= self.learning_rate * gradient
更多推荐

所有评论(0)