一、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(−yn​wTxn​)),令zn=−ynwTxnz_n=-y_nw^Tx_nzn​=−yn​wTxn​
  • 单个样本∇ℓn(w)=θ(−ynwTxn)(−ynxn)∇ℓ_n(w)=\theta(-y_nw^Tx_n)(-y_nx_n)∇ℓn​(w)=θ(−yn​wTxn​)(−yn​xn​)
  • 整体梯度:∇ℓ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​θ(−yn​wTxn​)(−yn​xn​)

【步骤】

  • 初始化权向量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−wTxn​1​

【与其他线性模型对比】

模型损失函数优点不足
感知器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​​↑:模型复杂度↑,Ein​E_{in​}Ein​​↓,但泛化误差边界Ω↑,易过拟合
  • dvcd_{vc}dvc​​↓:模型复杂度↓,Ω↓,但Ein​E_{in}​Ein​​↑,易欠拟合
  • EinE_{in}Ein​​小代表训练效果好,EoutE_{out}Eout​​大代表测试效果差

3.正则化——平衡训练误差与模型复杂度:在损失函数中加入参数惩罚项

  • 公式:minw​Eaug​(w)=Ein​(w)+λN​wTwmin_w​E_{aug}​(w)=E_{in}​(w)+\frac{λ}{N}​w^Twminw​​Eaug​​(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

更多推荐