本内容是博主自学机器学习总结的。由于博主水平有限,内容可能有些许错误。如有错误,请发在评论区。
目录
1、基础概念
1.1、什么是逻辑回归
逻辑回归(Logistic Regression)是一种用于分类问题的统计模型。它通过建立一个逻辑函数模型来预测某个事件属于某一类的概率,通常用于二元分类问题。逻辑回归输出的是概率值,值域介于0到1之间。模型最终通过设定一个阈值(如0.5),将连续的概率值转换为离散的分类标签(如0或1)。
逻辑回归的核心在于使用Sigmoid函数(逻辑函数)来将线性组合的结果映射为一个概率值。其公式如下:
P ( y = 1 ∣ X ) = 1 1 + e − ( θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n ) P(y=1|X) = \frac{1}{1 + e^{-(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \dots + \theta_n x_n)}} P(y=1∣X)=1+e−(θ0+θ1x1+θ2x2+⋯+θnxn)1
1.2、逻辑回归与线性回归的区别
尽管逻辑回归与线性回归都属于回归模型,但它们在用途和方法上有显著区别:
-
输出类型不同:
- 线性回归:用于连续变量预测,其输出是一个连续值(例如房价预测)。
- 逻辑回归:用于分类问题,其输出是一个概率值,通常用于二分类(例如预测邮件是否为垃圾邮件)。
-
目标函数不同:
- 线性回归:目标是最小化残差平方和(Ordinary Least Squares, OLS)。
- 逻辑回归:目标是最小化对数似然函数,通过最大化似然函数估计模型参数。
-
模型输出的范围:
- 线性回归的预测结果可以为负数或超出常规范围。
- 逻辑回归通过Sigmoid函数将结果限制在0到1之间,作为概率值。
-
适用场景:
- 线性回归适用于预测连续变量(如销量、温度等)。
- 逻辑回归适用于二分类或多分类问题(如疾病诊断、信用卡欺诈检测)。
1.3应用场景
逻辑回归广泛应用于需要分类的领域,尤其是二分类问题。以下是常见应用场景:
- 医学领域:用于预测患者是否患某种疾病(如预测心脏病发作的风险)。
- 金融领域:用于信用评分、贷款违约预测、欺诈检测等场景。
- 市场营销:用于客户分类(如预测用户是否会购买产品)、客户流失分析等。
- 社交媒体:用于垃圾邮件分类、用户行为预测等。
- 风险管理:评估企业或个人在未来发生风险事件的可能性。
逻辑回归在这些领域因其解释性强、计算效率高、且易于实现,被广泛采用。
2、逻辑回归模型
2.1、模型定义
逻辑回归是一种用于二分类问题的统计模型,旨在预测某个事件发生的概率。模型假设因变量 y y y 是二元的(即 y ∈ { 0 , 1 } y \in \{0, 1\} y∈{0,1}),并通过输入变量(特征) x x x的线性组合来估计事件属于某一类别的概率。模型的形式为:
P ( y = 1 ∣ x ) = 1 1 + e − ( θ 0 + θ 1 x 1 + ⋯ + θ n x n ) P(y=1|x) = \frac{1}{1 + e^{-(\theta_0 + \theta_1 x_1 + \dots + \theta_n x_n)}} P(y=1∣x)=1+e−(θ0+θ1x1+⋯+θnxn)1
用更简洁的符号表示为:
P ( y = 1 ∣ x ) = σ ( θ T x ) P(y=1|x) = \sigma(\theta^T x) P(y=1∣x)=σ(θTx)
其中:
- P ( y = 1 ∣ x ) P(y=1|x) P(y=1∣x)是事件 y = 1 y=1 y=1的概率。
- θ 0 , θ 1 , … , θ n \theta_0,\theta_1, \dots, \theta_n θ0,θ1,…,θn 是需要估计的模型参数。
- x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,…,xn是输入特征。
- 逻辑回归通过极大似然估计来估计模型参数。
2.2、Sigmoid函数
Sigmoid函数(也称为逻辑函数)是逻辑回归的核心,用来将线性回归模型的输出映射为一个0到1之间的概率。其数学表达式为:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
其中, z = θ 0 + θ 1 x 1 + ⋯ + θ n x n z = \theta_0 + \theta_1 x_1 + \dots + \theta_n x_n z=θ0+θ1x1+⋯+θnxn是输入变量的线性组合。
Sigmoid函数的输出在0到1之间,表示事件发生的概率。它具有以下特性:
- 当 z z z非常大时, σ ( z ) \sigma(z) σ(z)接近1;
- 当 z z z非常小时, σ ( z ) \sigma(z) σ(z)接近0;
- 当 z = 0 z = 0 z=0时, σ ( z ) = 0.5 \sigma(z) = 0.5 σ(z)=0.5。
这种性质使得Sigmoid函数非常适合用于二分类问题中的概率预测。
2.3、决策边界
决策边界是逻辑回归模型用于划分类别的阈值,通常为0.5。根据Sigmoid函数的性质,逻辑回归模型通过设定一个阈值来判断输入数据属于哪一类。
h θ ( x ) h_\theta(x) hθ(x) 是逻辑回归模型的预测函数,它基于输入特征$ x $ 和模型参数$ \theta $ 来预测样本属于正类(例如,标签为1)的概率。在逻辑回归中,这个预测函数通常采用Sigmoid函数,其数学表达式如下:
h θ ( x ) = σ ( θ T x ) = 1 1 + e − θ T x h_\theta(x) = \sigma(\boldsymbol{\theta}^T x) = \frac{1}{1 + e^{-\theta^T x}} hθ(x)=σ(θTx)=1+e−θTx1
这里, θ T x \boldsymbol{\theta}^T x θTx 表示参数向量 θ \boldsymbol{\theta} θ 和特征向量 x x x 的点积,即:
θ T x = θ 0 + θ 1 x 1 + θ 2 x 2 + … + θ n x n \boldsymbol{\theta}^T x = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \ldots + \theta_n x_n θTx=θ0+θ1x1+θ2x2+…+θnxn
其中, θ 0 \theta_0 θ0 是偏置项(bias term), x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2,…,xn是样本的特征值。注意:特征是 x x x,特征值是 x i x_i xi。
Sigmoid函数将任意实数值映射到(0, 1)区间内,这使得 h θ ( x ) h_\theta(x) hθ(x)的输出可以被解释为样本属于正类的概率。在二分类问题中,我们通常将这个概率与一个阈值(如0.5)进行比较,以决定最终的分类结果:
- 如果 h θ ( x ) > 0.5 h_\theta(x) > 0.5 hθ(x)>0.5,则预测样本属于正类(标签为1)。
- 如果 h θ ( x ) ≤ 0.5 h_\theta(x) \leq 0.5 hθ(x)≤0.5,则预测样本属于负类(标签为0)。
这种基于概率的预测方法不仅提供了分类结果,还给出了分类的置信度,这在许多应用场景中是非常有用的。例如,在医学诊断中,我们可能更关心测试结果的置信度,而不仅仅是一个简单的是或否的答案。
2.4、概率解释
逻辑回归的输出是事件发生的概率,而不是直接的分类标签。输出概率可以解释为某个事件属于类1的可能性。例如:
- 若 P ( y = 1 ∣ x ) = 0.8 P(y=1|x) = 0.8 P(y=1∣x)=0.8,表示在给定输入特征 x x x 的情况下,事件 y = 1 y=1 y=1发生的概率为80%。
- 若 P ( y = 1 ∣ x ) = 0.2 P(y=1|x) = 0.2 P(y=1∣x)=0.2,则表示事件 y = 1 y=1 y=1发生的概率为20%。
这一概率解释是逻辑回归的一个重要特点,它不仅给出一个分类结果,还提供了分类的置信度,从而能够在决策过程中提供更多信息。例如,在某些应用中,可以根据应用场景调整决策阈值,而不仅仅依赖默认的0.5阈值。
3、模型训练
3.1、损失函数
在逻辑回归中,模型通过最大化训练数据的似然函数来估计参数。由于直接最大化似然函数在数学上不方便处理,通常会最小化负的对数似然函数,也称为交叉熵损失。
对于逻辑回归,似然函数定义为给定输入特征 x x x 和对应标签 y y y,模型预测所有样本的概率的乘积。假设有 n n n个样本,定义如下:
L ( θ ) = ∏ i = 1 n P ( y i ∣ x i ) L(\theta) = \prod_{i=1}^{n} P(y^i|x^i) L(θ)=∏i=1nP(yi∣xi)
其中: P ( y i ∣ x i ) P(y^i|x^i) P(yi∣xi)是第 i i i 个样本的预测概率。
为了便于优化,我们通常采用负对数似然作为损失函数,公式为:
J ( θ ) = − ∑ i = 1 n [ y i l o g ( h θ ( x i ) ) + ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) ] 公式 ( 1 ) J(\theta) = -\sum_{i=1}^{n}\left[ y^i log(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))\right] 公式(1) J(θ)=−∑i=1n[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]公式(1)
其中, h θ ( x ) h_\theta(x) hθ(x)是样本 x i x^i xi属于正类的概率。
解释:
- 对于每个样本,损失函数根据预测结果与实际标签之间的差距计算“损失”。如果模型预测得越接近实际标签,损失越小,反之则损失越大。
- 优化目标是找到参数 θ \theta θ使损失函数 J ( θ ) J(\theta) J(θ) 最小。
公式推导:
-
公式(1):
对于二项分布公式,可以得出: P ( y i ∣ x i ) = h θ ( x i ) y i ( 1 − h θ ( x i ) ) 1 − y i P(y^i|x^i) =h_\theta(x^i)^{y^i}(1-h_\theta(x^i))^{1-y^i} P(yi∣xi)=hθ(xi)yi(1−hθ(xi))1−yi
所以:
L ( θ ) = ∏ i = 1 n P ( y i ∣ x i ) = ∏ i = 1 n h θ ( x i ) y i ( 1 − h θ ( x i ) ) 1 − y i L(\theta) = \prod_{i=1}^{n} P(y^i|x^i)=\prod_{i=1}^{n}h_\theta(x^i)^{y^i}(1-h_\theta(x^i))^{1-y^i} L(θ)=∏i=1nP(yi∣xi)=∏i=1nhθ(xi)yi(1−hθ(xi))1−yi
对它求对数,得到对数似然函数:
l ( θ ) = l o g ( L ( θ ) ) = ∑ i = 1 n y i l o g ( h θ ( x i ) ) + ∑ i = 1 n ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) l(\theta)=log(L(\theta))=\sum_{i=1}^{n} y^i log(h_\theta(x^i))+\sum_{i=1}^{n}(1-y^i)log(1-h_\theta(x^i)) l(θ)=log(L(θ))=∑i=1nyilog(hθ(xi))+∑i=1n(1−yi)log(1−hθ(xi))
l ( θ ) l(\theta) l(θ)可以作为逻辑回归的损失函数,但当损失函数是一个凸函数时,具备最小值。所以设定 J ( θ ) = − l ( θ ) J(\theta)=-l(\theta) J(θ)=−l(θ),即
J ( θ ) = − ∑ i = 1 n [ y i l o g ( h θ ( x i ) ) + ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) ] J(\theta) = -\sum_{i=1}^{n}\left[ y^i log(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))\right] J(θ)=−∑i=1n[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]
注:
- L ( θ ) L(\theta) L(θ) 还可以写成 L ( θ ∣ X ; Y ) 、 L ( θ ∣ X , Y ) L(\theta|X;Y)、L(\theta|X,Y) L(θ∣X;Y)、L(θ∣X,Y), l ( θ ) 、 J ( θ ) l(\theta)、J(\theta) l(θ)、J(θ)与它相同
- P ( y i ∣ x i ) P(y^i|x^i) P(yi∣xi) 还可以写成 P ( y i ∣ θ ; x i ) 、 P ( y i ∣ θ , x i ) P(y^i|\theta;x^i)、P(y^i|\theta,x^i) P(yi∣θ;xi)、P(yi∣θ,xi)
3.2、梯度下降法
梯度下降法(Gradient Descent)是逻辑回归模型中常用的优化算法之一,用于最小化损失函数,找到能够最小化损失函数的参数值 β \beta β。其基本思想是沿着损失函数的负梯度方向更新模型参数,逐步接近最优解。
梯度下降法的参数更新公式为:
θ j = θ j − α ∂ J ( θ ) ∂ θ j \theta_j = \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} θj=θj−α∂θj∂J(θ)
其中:
- θ j \theta_j θj是模型的第 j j j 个参数。
- α \alpha α 是学习率(步长),控制每次更新的幅度。
- ∂ J ( θ ) ∂ θ j \frac{\partial J(\theta)}{\partial \theta_j} ∂θj∂J(θ) 是损失函数关于参数 θ j \theta_j θj的偏导数,称为梯度。
每次迭代时,模型的参数根据损失函数的梯度进行调整,直到损失函数收敛到最小值。
优化过程:
-
计算梯度:
计算损失函数关于所有参数的梯度:
∇ J ( θ ) = ∂ J ( θ ) ∂ θ = ∑ i = 1 m ( h θ ( x i ) − y i ) x i \nabla J(\theta)=\frac{\partial J(\theta)}{\partial\theta}=\sum_{i=1}^m (h_\theta(x^i)-y^i)x^i ∇J(θ)=∂θ∂J(θ)=∑i=1m(hθ(xi)−yi)xi
将其转换成向量的形式:
∇ J ( θ ) = ∑ i = 1 m ( h θ ( x i ) − y i ) x i = [ x 1 x 2 . . . x n ] [ ( h θ ( x 1 ) − y 1 ( h θ ( x 2 ) − y 2 . . . ( h θ ( x m ) − y m ] = X T ( h θ ( X ) − Y ) \nabla J(\theta) = \sum_{i=1}^m (h_\theta(x^i)-y^i)x^i=\begin{bmatrix}x_1 &x_2&...&x_n \end{bmatrix}\begin{bmatrix}(h_\theta(x^1)-y^1 \\(h_\theta(x^2)-y^2 \\ ...\\(h_\theta(x^m)-y^m \end{bmatrix}=X^T (h_\theta(X) - Y) ∇J(θ)=∑i=1m(hθ(xi)−yi)xi=[x1x2...xn] (hθ(x1)−y1(hθ(x2)−y2...(hθ(xm)−ym =XT(hθ(X)−Y)
其中:
X X X 是包含所有样本特征的矩阵, θ \boldsymbol{\theta} θ 是参数向量, h θ ( X ) h_\theta(X) hθ(X)是所有样本的预测概率向量, Y Y Y是所有样本的实际标签向量
因为 θ \boldsymbol{\theta} θ 和 x x x 维度相同,所以当 x x x 有 m m m维的时候, θ \boldsymbol{\theta} θ同样有 m m m维,此时 J ( θ ) J(\theta) J(θ)的求导也变成了对 θ \boldsymbol{\theta} θ的每一个维度求导:
∂ J ( θ ) ∂ θ j = ∑ i = 1 m ( h θ ( x i ) − y i ) x j i \frac{\partial J(\theta)}{\partial\theta_j}=\sum_{i=1}^m (h_\theta(x^i)-y^i)x^i_j ∂θj∂J(θ)=∑i=1m(hθ(xi)−yi)xji
-
更新参数:
接下来,我们根据梯度和学习率 α \alpha α 来更新每个参数。学习率是一个超参数,它控制了每次更新参数时步长的大小。参数更新的公式为:
θ j = θ j − α ∂ J ( θ ) ∂ θ j \theta_j = \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} θj=θj−α∂θj∂J(θ)
-
重复迭代:
我们重复步骤1和2,直到满足某个停止条件。停止条件可以是:
- 梯度足够小,即 ∥ ∇ J ( θ ) ∥ \|\nabla J(\theta)\| ∥∇J(θ)∥小于一个预设的阈值。
- 达到最大迭代次数。
- 损失函数的值不再显著下降。
伪代码:
# 初始化参数
theta = np.array([0.0, 0.0, 0.0]) # 包括偏置项theta_0
# 设置学习率和迭代次数
alpha = 0.01
iterations = 1000
# 特征矩阵X和标签向量Y
X = np.array([[1, 1, 2], [1, 2, 3], [1, 3, 4], [1, 4, 5]]) # 添加偏置项
Y = np.array([0, 1, 1, 0])
# 梯度下降
for i in range(iterations):
# 预测
predictions = 1 / (1 + np.exp(-np.dot(X, theta)))
#np.dot(X, theta)计算了特征矩阵X和参数向量theta的点积,得到每个样本的线性组合。然后,对这个线性组合取负值,通过np.exp计算其指数,得到一个接近0或正无穷的值。
# 计算梯度
gradient = np.dot(X.T, (predictions - y)) / len(y)
#(predictions - y)计算了预测概率和实际标签之间的差异。然后,np.dot(X.T, ...)将这个差异与特征矩阵X的转置相乘,得到梯度向量
# 更新参数
theta -= alpha * gradient
# 输出最终的参数
print(theta)
3.3、牛顿法
梯度下降法实现相对简单,但其收敛速度较慢。在较小值附近,梯度下降法会以一种曲折的慢速方式来逼近最小点,此时可以考虑采用牛顿法和拟牛顿法。
1. 牛顿法:
牛顿法通过使用二阶导数(即 Hessian 矩阵)来找到损失函数的最小值。更新公式为:
θ k + 1 = θ k − H ( θ k ) − 1 ∇ f ( θ k ) \theta_{k+1} = \theta_k - H(\theta_k)^{-1} \nabla f(\theta_k) θk+1=θk−H(θk)−1∇f(θk)
其中:
- H H H是 Hessian 矩阵,表示损失函数的二阶导数。
- ∇ f ( θ k ) \nabla f(\theta_k) ∇f(θk)是损失函数的梯度。
- θ k \theta_k θk 表示第 k k k 次迭代时的参数向量
牛顿法通常收敛速度更快,因为它利用了二阶信息,可以更精确地找到损失函数的最优解。然而,计算 Hessian 矩阵在高维数据上代价较高,因此牛顿法更适用于中小型数据集。
公式推导:
在泰勒展开式中,对于函数 f ( x ) f(x) f(x),当 x x x在 x 0 x_0 x0附近时可以使用如下展开式来逼近 f ( x ) f(x) f(x):
f ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + f ′ ′ ′ ( a ) 3 ! ( x − a ) 3 + ⋯ + f ( n ) ( a ) n ! ( x − a ) n + R n ( x ) f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \frac{f'''(a)}{3!}(x-a)^3 + \cdots + \frac{f^{(n)}(a)}{n!}(x-a)^n + R_n(x) f(x)=f(a)+f′(a)(x−a)+2!f′′(a)(x−a)2+3!f′′′(a)(x−a)3+⋯+n!f(n)(a)(x−a)n+Rn(x)
在牛顿法中,我们使用逐步逼近的方法来求解参数 θ \theta θ。这里我们用下标 k k k标识在第 k k k步的诸标量值。例如,用 θ k \theta_k θk表示第 k k k步的 θ \theta θ值。在第 k k k步,我们有当前估计 θ k \theta_k θk,就可以将 f ( θ ) f(\theta) f(θ)(损失函数)用在其在 θ k \theta_k θk处的二阶泰勒展开式来近似:
f ( θ ) ≈ f ( θ k ) + ∇ f ( θ k ) T ( θ − θ k ) + 1 2 ( θ − θ k ) T H ( θ k ) ( θ − θ k ) f(\theta) \approx f(\theta_k) + \nabla f(\theta_k)^T (\theta - \theta_k) + \frac{1}{2} (\theta - \theta_k)^T H(\theta_k) (\theta - \theta_k) f(θ)≈f(θk)+∇f(θk)T(θ−θk)+21(θ−θk)TH(θk)(θ−θk)
这里:
- f ( θ k ) f(\theta_k) f(θk) 是一个标量,表示函数在 θ k \theta_k θk 处的值。
-
∇
f
(
θ
k
)
\nabla f(\theta_k)
∇f(θk) 是
f
f
f 在
θ
k
\theta_k
θk 处的梯度,是一个
n
n
n 维向量。
- 它由函数 f f f 在点 θ k \theta_k θk 处的偏导数构成。
- 具体来说,如果 θ k = ( θ k 1 , θ k 2 , … , θ k n ) T \theta_k = (\theta_{k1}, \theta_{k2}, \ldots, \theta_{kn})^T θk=(θk1,θk2,…,θkn)T) 是一个 n n n 维向量,那么梯度 ∇ f ( θ k ) \nabla f(\theta_k) ∇f(θk)就是函数 f f f 对每个变量 θ k i \theta_{ki} θki的偏导数组成的向量。
- 梯度向量的每个分量定义如下: ∇ f ( θ k ) = [ ∂ f ∂ θ 1 ( θ k ) ∂ f ∂ θ 2 ( θ k ) ⋮ ∂ f ∂ θ n ( θ k ) ] \nabla f(\theta_k) = \begin{bmatrix} \frac{\partial f}{\partial \theta_1}(\theta_k) \\ \frac{\partial f}{\partial \theta_2}(\theta_k) \\ \vdots \\ \frac{\partial f}{\partial \theta_n}(\theta_k) \end{bmatrix} ∇f(θk)= ∂θ1∂f(θk)∂θ2∂f(θk)⋮∂θn∂f(θk) 这里,每个分量 ∂ f ∂ θ i ( θ k ) \frac{\partial f}{\partial \theta_i}(\theta_k) ∂θi∂f(θk) 表示函数 f f f 在点 θ k \theta_k θk 处对第 i i i 个变量 θ i \theta_i θi 的偏导数。
-
H
(
θ
k
)
H(\theta_k)
H(θk)是
f
f
f 在
θ
k
\theta_k
θk处的黑塞矩阵,是一个
n
×
n
n \times n
n×n 矩阵。
- 它的构成基于函数 f f f 在点 θ k \theta_k θk 处的二阶偏导数。
- 具体来说,如果 f f f 是一个 n n n 变量的函数,那么黑塞矩阵 H ( θ k ) H(\theta_k) H(θk)中第 i i i行第 j j j 列的元素是 f f f 对第 i i i 个变量和第 j j j 个变量的二阶偏导数,即: H ( θ k ) i j = ∂ 2 f ∂ θ i ∂ θ j ( θ k ) H(\theta_k)_{ij} = \frac{\partial^2 f}{\partial \theta_i \partial \theta_j}(\theta_k) H(θk)ij=∂θi∂θj∂2f(θk)这意味着黑塞矩阵的主对角线上的元素是函数对每个变量的二阶偏导数,而非对角线元素则是混合偏导数。由于混合偏导数的等价性(克莱罗定理),黑塞矩阵是对称的,即 H ( θ k ) i j = H ( θ k ) j i H(\theta_k)_{ij} = H(\theta_k)_{ji} H(θk)ij=H(θk)ji。
- θ \theta θ 是我们要求解的向量。
- θ k \theta_k θk 是当前的估计向量。
- θ − θ k \theta - \theta_k θ−θk 是向量 θ \theta θ 和 θ k \theta_k θk 之间的差,也是一个 n n n 维向量。
在牛顿法中,我们希望找到下一个点 θ k + 1 \theta_{k+1} θk+1,使得 f ( θ k + 1 ) f(\theta_{k+1}) f(θk+1)尽可能小。所以对 f ( θ ) f(\theta) f(θ)进行求导,并将导数置为0:
∂ f ( θ ) ∂ θ = f ( θ k ) + ∇ f ( θ k ) T ( θ − θ k ) + 1 2 ( θ − θ k ) T H ( θ k ) ( θ − θ k ) ∂ θ = ∇ f ( θ k ) T + ( θ − θ k ) H ( θ k ) = 0 \frac{\partial f(\theta)}{\partial \theta}=\frac{f(\theta_k) + \nabla f(\theta_k)^T (\theta - \theta_k) + \frac{1}{2} (\theta - \theta_k)^T H(\theta_k) (\theta - \theta_k)}{\partial \theta}=\nabla f(\theta_k)^T+(\theta - \theta_k) H(\theta_k)=0 ∂θ∂f(θ)=∂θf(θk)+∇f(θk)T(θ−θk)+21(θ−θk)TH(θk)(θ−θk)=∇f(θk)T+(θ−θk)H(θk)=0
解上述方程得到:
( θ − θ k ) T H ( θ k ) = − ∇ f ( θ k ) T (\theta - \theta_k)^T H(\theta_k) = -\nabla f(\theta_k)^T (θ−θk)TH(θk)=−∇f(θk)T
由于 H ( θ k ) H(\theta_k) H(θk)是一个方阵,我们可以将两边乘以 H ( θ k ) H(\theta_k) H(θk) 的逆矩阵:
θ − θ k = − H ( θ k ) − 1 ∇ f ( θ k ) \theta - \theta_k = -H(\theta_k)^{-1} \nabla f(\theta_k) θ−θk=−H(θk)−1∇f(θk)
因此:
θ = θ k − H ( θ k ) − 1 ∇ f ( θ k ) \theta = \theta_k - H(\theta_k)^{-1} \nabla f(\theta_k) θ=θk−H(θk)−1∇f(θk)
将 θ \theta θ更新为 θ k + 1 \theta_{k+1} θk+1:
θ k + 1 = θ k − H ( θ k ) − 1 ∇ f ( θ k ) \theta_{k+1} = \theta_k - H(\theta_k)^{-1} \nabla f(\theta_k) θk+1=θk−H(θk)−1∇f(θk)
2. 逻辑回归的牛顿法求解
θ k + 1 = θ k − H ( θ k ) − 1 ∇ J ( θ k ) \theta_{k+1} = \theta_k - H(\theta_k)^{-1} \nabla J(\theta_k) θk+1=θk−H(θk)−1∇J(θk)
梯度:
∇ J ( θ ) = X T ( h θ ( X ) − Y ) \nabla J(\theta) =X^T (h_\theta(X) - Y) ∇J(θ)=XT(hθ(X)−Y)
海森矩阵:
H ( θ ) = X T S X H(\theta) = X^T SX H(θ)=XTSX
其中: S S S 为对角矩阵,其第 i i i个对角元素为 h θ ( x i ) ( 1 − h θ ( x i ) ) h_\theta(x_i)(1 - h_\theta(x_i)) hθ(xi)(1−hθ(xi))。对于一个包含 m m m 个样本的数据集, S S S 的矩阵形式是:
S = [ h θ ( x 1 ) ( 1 − h θ ( x 1 ) ) 0 ⋯ 0 0 h θ ( x 2 ) ( 1 − h θ ( x 2 ) ) ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ h θ ( x m ) ( 1 − h θ ( x m ) ) ] S = \begin{bmatrix} h_\theta(x_1)(1 - h_\theta(x_1)) & 0 & \cdots & 0 \\ 0 & h_\theta(x_2)(1 - h_\theta(x_2)) & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & h_\theta(x_m)(1 - h_\theta(x_m)) \end{bmatrix} S= hθ(x1)(1−hθ(x1))0⋮00hθ(x2)(1−hθ(x2))⋮0⋯⋯⋱⋯00⋮hθ(xm)(1−hθ(xm))
牛顿法的迭代步骤
-
初始化参数:选择初始参数 θ 0 \theta_0 θ0,通常设为 0 向量。
-
计算预测概率:根据当前参数 θ \theta θ,计算预测的概率 h θ ( x ) = σ ( θ T x ) h_\theta(x) = \sigma(\theta^Tx) hθ(x)=σ(θTx)。
-
计算梯度和 Hessian:
-
计算梯度 g ( θ ) = X T ( h θ ( x ) − Y ) g(\theta) = X^T (h_\theta(x)-Y) g(θ)=XT(hθ(x)−Y)。
-
计算 Hessian 矩阵 H ( θ ) = X T S X H(\theta) = X^T S X H(θ)=XTSX,其中 S S S 为对角矩阵。
-
-
更新参数:根据牛顿法的公式更新参数:
θ k + 1 = θ k + 1 − H ( θ ) − 1 g ( θ ) \theta_{k+1} = \theta_{k+1} - H(\theta)^{-1} g(\theta) θk+1=θk+1−H(θ)−1g(θ)
-
检查收敛:判断参数更新后的变化量 ∥ θ k + 1 − θ k ∥ \|\theta_{k+1} - \theta_{k}\| ∥θk+1−θk∥ 是否小于设定的阈值 ϵ \epsilon ϵ,如果是,则停止迭代,否则返回步骤 2 继续迭代。
-
输出结果:当满足收敛条件时,输出最优的参数 θ \theta θ。
在实践中,由于黑塞矩阵 H ( θ ) H(θ) H(θ)是正定的,它的逆可以保证存在,并且这个更新公式可以有效地用于求解逻辑回归问题。然而,计算黑塞矩阵及其逆在计算上可能很昂贵,特别是对于大型数据集。因此,通常使用更高效的优化算法,如梯度下降法或拟牛顿法。
3.4、拟牛顿法
由于牛顿法需要计算海森矩阵的逆,因此计算量较大。随着未知数维度 D D D的增大,海森矩阵( D × D D\times D D×D)也会增大,需要的存储空间增多,计算量增大,有时候甚至会大到不可计算。
拟牛顿法(Quasi-Newton Methods)是一类用于求解无约束优化问题的迭代方法,它是对经典牛顿法的改进。与牛顿法不同,**拟牛顿法不需要直接计算 Hessian 矩阵的逆,而是通过逐步构造近似 Hessian 矩阵的方式来进行优化。**这使得拟牛顿法在高维问题中更加高效,且减少了计算成本。
**BFGS(Broyden-Fletcher-Goldfarb-Shanno)**方法是拟牛顿法中的一种常用算法,用于解决无约束优化问题。它通过迭代逐步逼近目标函数的Hessian矩阵,避免了直接计算Hessian矩阵的复杂性,并保持较高的收敛效率。以下是BFGS方法的关键原理和步骤。
1.基本思想
BFGS方法的核心在于利用迭代过程中得到的梯度信息,逐步更新近似的Hessian矩阵 B k B_k Bk(或它的逆矩阵 D k = B k − 1 D_k = B_k^{-1} Dk=Bk−1),而不是显式计算目标函数的Hessian矩阵。每次迭代时,更新的近似矩阵能够反映目标函数的局部曲率,从而加速收敛。
2.BFGS算法步骤
2.1 初始条件
- 初始点 θ 0 \theta_0 θ0。注:这里的 θ 0 \theta_0 θ0不是值,是 θ \theta θ初始化时的向量
- 初始Hessian矩阵的逆矩阵 D 0 D_0 D0(通常选择为单位矩阵)
- 设定收敛容差 ϵ \epsilon ϵ
2.2 迭代步骤
-
计算搜索方向:
在每次迭代中,计算当前迭代点的搜索方向 $ p_k $:
p k = − D k ∇ f ( θ k ) p_k = -D_k \nabla f(\theta_k) pk=−Dk∇f(θk)
其中: ∇ f ( θ k ) \nabla f(\theta_k) ∇f(θk)是在点 θ k \theta_k θk处目标函数的梯度, D k D_k Dk 是近似的Hessian矩阵的逆矩阵。该搜索方向通常是下降方向。 -
线搜索:
进行线搜索的目的是寻找合适的步长 α k \alpha_k αk,以确保在每次迭代中沿着当前的搜索方向 p k p_k pk 进行更新时,目标函数 f ( θ ) f(\theta) f(θ) 取得充分的下降。
θ k + 1 = θ k + α k p k \theta_{k+1} = \theta_k + \alpha_k p_k θk+1=θk+αkpk
其中:步长 α k \alpha_k αk不能随意选取,通常通过满足Wolfe条件或Armijo条件来确定。
-
更新参数:
计算两个向量:- 梯度变化量
y
k
y_k
yk:
y k = ∇ f ( θ k + 1 ) − ∇ f ( θ k ) y_k = \nabla f(\theta_{k+1}) - \nabla f(\theta_k) yk=∇f(θk+1)−∇f(θk)- 位置变化量
s
k
s_k
sk:
s k = θ k + 1 − θ k s_k = \theta_{k+1} - \theta_k sk=θk+1−θk
- 位置变化量
s
k
s_k
sk:
- 梯度变化量
y
k
y_k
yk:
-
更新近似的Hessian矩阵的逆矩阵 D k D_k Dk:
根据以下更新公式更新 $D_k $: D k + 1 = ( I − s k y k T y k T s k ) D k ( I − y k s k T y k T s k ) + s k s k T y k T s k D_{k+1} = \left( I - \frac{s_k y_k^T}{y_k^T s_k} \right) D_k \left( I - \frac{y_k s_k^T}{y_k^T s_k} \right) + \frac{s_k s_k^T}{y_k^T s_k} Dk+1=(I−ykTskskykT)Dk(I−ykTskykskT)+ykTskskskT
该公式能保持 D k + 1 D_{k+1} Dk+1的正定性和对称性,同时逐步逼近真实的Hessian矩阵。
-
判断收敛:
若梯度的范数 ∥ ∇ f ( θ k + 1 ) ∥ \|\nabla f(\theta_{k+1})\| ∥∇f(θk+1)∥ 小于设定的收敛容差 ϵ \epsilon ϵ,则迭代终止;否则继续进行下一次迭代。
3.L-BFGS:BFGS的改进版本
在处理大规模问题时,BFGS方法由于需要存储和更新完整的Hessian矩阵,可能会消耗过多内存。为此,引入了L-BFGS(Limited-memory BFGS)方法,它只存储少量的历史信息,用于更新Hessian矩阵的近似,显著减少了内存需求,适用于大规模优化问题。
3.4、正则化
正则化是一种防止模型过拟合的技术。过拟合是指模型在训练数据上表现良好,但在新数据上表现较差。通过在损失函数中加入正则项,可以对模型参数施加约束,避免过拟合。
-
L1正则化(Lasso):
L1正则化通过在损失函数中加入模型参数的绝对值之和来约束参数。L1正则化的损失函数为: J ( θ ) = − ∑ i = 1 n [ y i l o g ( h θ ( x i ) ) + ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) ] + λ ∑ j = 1 m ∣ θ i ∣ J(\theta) = -\sum_{i=1}^{n}\left[ y^i log(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))\right] + \lambda \sum_{j=1}^{m} |\theta_i| J(θ)=−∑i=1n[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]+λ∑j=1m∣θi∣
其中, λ \lambda λ是正则化系数,控制正则化的强度。
效果:L1正则化会将一些不重要的参数缩小到零,从而进行特征选择,使模型稀疏化。
-
L2正则化(Ridge):
L2正则化通过在损失函数中加入参数平方之和来约束参数。L2正则化的损失函数为: J θ ) = − ∑ i = 1 n [ y i l o g ( h θ ( x i ) ) + ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) ] + λ ∑ j = 1 m θ j 2 J\theta) = -\sum_{i=1}^{n}\left[ y^i log(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))\right] + \lambda \sum_{j=1}^{m} \theta_j^2 Jθ)=−∑i=1n[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]+λ∑j=1mθj2
效果:L2正则化将较大的参数缩小,但不会将参数缩小到零,因此它有助于防止模型过度复杂化,而不会完全消除某些特征。
-
Elastic Net:
Elastic Net 是 L1 和 L2 正则化的组合,它结合了两者的优点,既能实现稀疏化,又能防止过拟合。其损失函数为: J ( θ ) = − ∑ i = 1 n [ y i l o g ( h θ ( x i ) ) + ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) ] + λ 1 ∑ j = 1 m ∣ θ j ∣ + λ 2 ∑ j = 1 m θ j 2 J(\theta) = -\sum_{i=1}^{n}\left[ y^i log(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))\right] + \lambda_1 \sum_{j=1}^{m} |\theta_j| + \lambda_2 \sum_{j=1}^{m} \theta_j^2 J(θ)=−∑i=1n[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]+λ1∑j=1m∣θj∣+λ2∑j=1mθj2
其中, λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 控制 L1 和 L2 正则化的强度。
3.5、总结
- 对数似然损失 是逻辑回归的核心损失函数,它通过最大化数据的似然来估计模型参数。
- 梯度下降法 是常用的优化方法,适用于大规模数据集。
- 牛顿法 和 拟牛顿法 提供了更快的收敛速度,适用于较小规模的数据集。
- 正则化 技术(L1、L2)可以防止过拟合,并帮助模型提高泛化能力。
4、多分类问题
在多分类问题中,常见的分类策略包括“一对多(One-vs-All)”、“一对一(One-vs-One)”以及多标签分类。以下是对这些策略的详细解释:
4.1、一对多(One-vs-All)
一对多策略又称为“一个对所有(One-vs-Rest)”,其基本思路是为每个类别训练一个二分类器。对于每个类别 k k k:
- 将该类别视为正类,其他所有类别视为负类。
- 训练 K K K个二分类器(其中 K K K 是类别数量),每个分类器的输出是对其对应类别的概率。
在预测时,对于输入样本,计算所有 K K K 个分类器的输出概率,选择概率最高的分类器作为最终的预测结果。这种方法的优点是实现简单且容易扩展到多个类别,但可能在类别不平衡时表现不佳。
4.2、 一对一(One-vs-One)
一对一策略的基本思路是为每一对类别训练一个分类器。对于 K K K 个类别,训练 K ( K − 1 ) 2 \frac{K(K-1)}{2} 2K(K−1) 个分类器。每个分类器只区分两个类别。例如,假设有三个类别 A、B 和 C:
- 训练分类器 1:区分 A 和 B
- 训练分类器 2:区分 A 和 C
- 训练分类器 3:区分 B 和 C
在预测时,所有分类器进行投票,每个分类器将其预测结果投给所区分的类别,选择获得最多投票的类别作为最终结果。这种方法通常可以提高分类的准确性,但随着类别数量的增加,分类器的数量会迅速增加,计算成本较高。
4.3、多标签分类
多标签分类问题与多分类问题不同,在多标签分类中,每个样本可以同时属于多个类别。常见的应用场景包括文本分类(例如一篇文章可以同时被标记为“科技”和“健康”)、图像标注(例如一张图片可能同时标注为“海洋”、“沙滩”、“日落”等)。
在多标签分类中,通常有以下几种处理方式:
- 二进制标记:为每个类别训练一个二分类器,输出每个类别的概率(类似于一对多策略)。
- 多标签损失函数:使用如二元交叉熵损失函数等来处理多个标签的情况,确保在训练时能够同时考虑所有标签。
5、数学基础
5.1、概率论基础
概率论是研究随机事件发生规律的数学分支。它的核心概念是“事件发生的可能性”,用概率来衡量某个事件的发生。概率的基本性质包括:
- 概率值的范围:对于任何事件 A A A,其概率 P ( A ) P(A) P(A) 满足 0 ≤ P ( A ) ≤ 1 0 \leq P(A) \leq 1 0≤P(A)≤1,即概率介于0和1之间。
- 互斥事件:如果事件 A A A 和 B B B互斥(即它们不能同时发生),则 P ( A ∪ B ) = P ( A ) + P ( B ) P(A \cup B) = P(A) + P(B) P(A∪B)=P(A)+P(B)。
- 全概率:对于所有可能的事件,所有事件的概率和为1,即 P ( Ω ) = 1 P(\Omega) = 1 P(Ω)=1,其中 Ω \Omega Ω是样本空间。
5.2、条件概率
条件概率表示在事件 B B B已经发生的前提下,事件 A A A 发生的概率,记作 P ( A ∣ B ) P(A|B) P(A∣B)。条件概率的公式为:
P ( A ∣ B ) = P ( A ∩ B ) P ( B ) P(A|B) = \frac{P(A \cap B)}{P(B)} P(A∣B)=P(B)P(A∩B)
条件概率刻画了两个事件之间的关联性,是理解许多概率概念的基础。它也用于逻辑回归中的似然估计,帮助我们在已知条件下评估某一事件的概率。
5.3、贝叶斯定理
贝叶斯定理是条件概率的一个重要结果,提供了如何通过逆向思维来计算事件的概率。其公式为:
P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)⋅P(A)
这里:
- P ( A ∣ B ) P(A|B) P(A∣B) 是给定 B B B发生的条件下,事件 A A A 发生的概率(后验概率)。
- P ( B ∣ A ) P(B|A) P(B∣A) 是事件 A A A 发生时,事件发 B B B生的概率(似然)。
- P ( A ) P(A) P(A)是事件 A A A 的先验概率。
- P ( B ) P(B) P(B)是事件 B B B的全概率。
贝叶斯定理的重要性在于它通过已有数据和先验信息,帮助我们更新对某事件的预测。它在逻辑回归模型的解释中也常用到,特别是当我们处理具有先验概率的信息时。
5.4、概率分布
概率分布描述了随机变量取不同值的概率。对于逻辑回归,常用的分布是二项分布,它用于表示只有两个可能结果的随机事件。
二项分布描述了在 n n n次独立的伯努利试验(即每次试验只有两个可能结果,如“成功”或“失败”)中,成功发生 k k k次的概率。其概率质量函数为:
P ( X = k ) = ( n k ) p k ( 1 − p ) n − k P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} P(X=k)=(kn)pk(1−p)n−k
其中:
- X X X 是成功次数。
- n n n 是试验的总次数。
- p p p是单次试验成功的概率。
- ( n k ) \binom{n}{k} (kn) 是组合数,表示从 n n n次试验中选择 k k k 次成功的方式数。
在逻辑回归中,目标变量通常是二元的(如0或1),因此其结果常被认为是来自二项分布。在模型拟合过程中,逻辑回归通过最大化二项分布的似然函数来找到最佳参数估计值。