【ShuQiHere】
逻辑回归是机器学习中一个经典的分类算法,尽管它的名字中带有“回归”,但它的主要用途是处理二分类问题。逻辑回归通过一个逻辑函数(Sigmoid 函数)将输入特征映射到一个概率值上,然后根据这个概率值进行分类。本文将带你从零开始一步步实现逻辑回归,并深入探讨背后的核心算法——反向传播与梯度下降。
逻辑回归的数学基础
逻辑回归的目标是找到一个逻辑函数,能够将输入特征映射到一个 (0, 1) 之间的概率值,从而对输入数据进行分类。逻辑回归的模型形式如下:
[
Y
=
σ
(
W
X
+
b
)
Y = \sigma(WX + b)
Y=σ(WX+b)
]
其中:
- ( W ) 是权重向量
- ( X ) 是输入特征向量
- ( b ) 是偏置项
- ( \sigma(z) ) 是 Sigmoid 函数,其定义为:
[
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z) = \frac{1}{1 + e^{-z}}
σ(z)=1+e−z1
]
这个公式可能看起来有点抽象,但它的核心思想很简单:通过调整权重 ( W ) 和偏置 ( b ) ,我们可以找到一个函数,使得它能够将不同类别的数据分开。
损失函数
为了衡量模型的预测值与真实值之间的差异,我们使用二元交叉熵损失(Binary Cross-Entropy Loss)。它的形式如下:
[
Loss
=
−
1
m
∑
i
=
1
m
[
Y
(
i
)
log
(
Y
^
(
i
)
)
+
(
1
−
Y
(
i
)
)
log
(
1
−
Y
^
(
i
)
)
]
\text{Loss} = -\frac{1}{m} \sum_{i=1}^{m} [Y^{(i)} \log(\hat{Y}^{(i)}) + (1 - Y^{(i)}) \log(1 - \hat{Y}^{(i)})]
Loss=−m1i=1∑m[Y(i)log(Y^(i))+(1−Y(i))log(1−Y^(i))]
]
其中,( m ) 是样本数量,( \hat{Y}^{(i)} ) 是第 ( i ) 个样本的预测值。这个损失函数通过最大化预测的对数概率来优化模型,让我们的预测更加接近真实值。
反向传播(Backward Propagation)
反向传播是逻辑回归中优化模型参数的关键步骤。通过计算损失函数相对于每个参数的梯度,并利用这些梯度来更新参数,我们可以使损失函数逐渐减小,从而优化模型。
对于逻辑回归,损失函数相对于权重 ( W ) 和偏置 ( b ) 的梯度计算如下:
[
∂
Loss
∂
W
=
1
m
∑
i
=
1
m
(
A
(
i
)
−
Y
(
i
)
)
×
X
(
i
)
\frac{\partial \text{Loss}}{\partial W} = \frac{1}{m} \sum_{i=1}^{m} (A^{(i)} - Y^{(i)}) \times X^{(i)}
∂W∂Loss=m1i=1∑m(A(i)−Y(i))×X(i)
]
[
∂
Loss
∂
b
=
1
m
∑
i
=
1
m
(
A
(
i
)
−
Y
(
i
)
)
\frac{\partial \text{Loss}}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} (A^{(i)} - Y^{(i)})
∂b∂Loss=m1i=1∑m(A(i)−Y(i))
]
其中,( A^{(i)} ) 是通过 Sigmoid 函数计算出的预测值。这个过程听起来复杂,但实际上就是在不断微调权重和偏置,让模型的预测越来越准确。
反向传播的实现
def backward_propagation(X, A, Y):
m = X.shape[1]
dw = (1/m) * np.dot(X, (A - Y).T)
db = (1/m) * np.sum(A - Y)
return dw, db
梯度下降(Gradient Descent)
梯度下降是一种用于优化模型参数的算法。其核心思想是沿着损失函数下降最快的方向(即梯度的反方向)更新参数,最终找到使损失函数最小化的参数值。
梯度下降的更新规则如下:
[
W
:
=
W
−
α
×
∂
Loss
∂
W
W := W - \alpha \times \frac{\partial \text{Loss}}{\partial W}
W:=W−α×∂W∂Loss
]
[
b
:
=
b
−
α
×
∂
Loss
∂
b
b := b - \alpha \times \frac{\partial \text{Loss}}{\partial b}
b:=b−α×∂b∂Loss
]
其中,( \alpha ) 是学习率,决定了每次参数更新的步伐大小。选择合适的学习率对于训练一个表现良好的模型至关重要。
梯度下降的实现
def update_parameters(w, b, dw, db, learning_rate):
w = w - learning_rate * dw
b = b - learning_rate * db
return w, b
逻辑回归的实现步骤
在理解了反向传播和梯度下降之后,我们可以开始实现一个完整的逻辑回归模型。以下是实现步骤。
1. 初始化参数
首先,我们需要初始化模型的权重 ( W ) 和偏置 ( b )。权重可以初始化为零或随机小值,偏置初始化为零。
def initialize_parameters(dim):
w = np.zeros((dim, 1))
b = 0
return w, b
2. 前向传播
前向传播用于计算模型的输出,即将输入特征通过逻辑函数转换为概率值。
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def forward_propagation(X, w, b):
z = np.dot(w.T, X) + b
A = sigmoid(z)
return A
3. 计算损失
接下来,我们使用二元交叉熵损失来计算模型预测值与真实值之间的差异。
def compute_loss(A, Y):
m = Y.shape[1]
loss = -1/m * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
return loss
4. 模型训练
在模型训练过程中,我们通过多次迭代,不断进行前向传播、计算损失、反向传播以及参数更新,最终得到一个准确率较高的模型。
def train(X, Y, num_iterations, learning_rate):
w, b = initialize_parameters(X.shape[0])
for i in range(num_iterations):
A = forward_propagation(X, w, b)
loss = compute_loss(A, Y)
dw, db = backward_propagation(X, A, Y)
w, b = update_parameters(w, b, dw, db, learning_rate)
return w, b
5. 模型评估
最后,我们可以通过预测函数和模型在测试集上的表现来评估模型的性能。
def predict(X, w, b):
A = forward_propagation(X, w, b)
predictions = np.where(A > 0.5, 1, 0)
return predictions
结论
逻辑回归是机器学习领域中的一块基石,虽然看似简单,但通过深入理解其背后的反向传播与梯度下降算法,我们不仅能掌握如何从零开始实现它,还能为理解更加复杂的模型打下坚实的基础。希望本文的详细讲解,能帮助你在机器学习的道路上迈出坚实的一步。