逻辑回归是机器学习中一个经典的分类算法,尽管它的名字中带有“回归”,但它的主要用途是处理二分类问题。逻辑回归通过一个逻辑函数(Sigmoid 函数)将输入特征映射到一个概率值上,然后根据这个概率值进行分类。本文将带你从零开始一步步实现逻辑回归,并深入探讨背后的核心算法——反向传播与梯度下降。
逻辑回归的目标是找到一个逻辑函数,能够将输入特征映射到一个 (0, 1) 之间的概率值,从而对输入数据进行分类。逻辑回归的模型形式如下:
[
Y = σ ( W X + b ) Y = \sigma(WX + b) Y=σ(WX+b)
]
其中:
[
σ ( 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 ) 个样本的预测值。这个损失函数通过最大化预测的对数概率来优化模型,让我们的预测更加接近真实值。
反向传播是逻辑回归中优化模型参数的关键步骤。通过计算损失函数相对于每个参数的梯度,并利用这些梯度来更新参数,我们可以使损失函数逐渐减小,从而优化模型。
对于逻辑回归,损失函数相对于权重 ( 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
梯度下降是一种用于优化模型参数的算法。其核心思想是沿着损失函数下降最快的方向(即梯度的反方向)更新参数,最终找到使损失函数最小化的参数值。
梯度下降的更新规则如下:
[
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
在理解了反向传播和梯度下降之后,我们可以开始实现一个完整的逻辑回归模型。以下是实现步骤。
首先,我们需要初始化模型的权重 ( W ) 和偏置 ( b )。权重可以初始化为零或随机小值,偏置初始化为零。
def initialize_parameters(dim):
w = np.zeros((dim, 1))
b = 0
return w, b
前向传播用于计算模型的输出,即将输入特征通过逻辑函数转换为概率值。
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
接下来,我们使用二元交叉熵损失来计算模型预测值与真实值之间的差异。
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
在模型训练过程中,我们通过多次迭代,不断进行前向传播、计算损失、反向传播以及参数更新,最终得到一个准确率较高的模型。
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
最后,我们可以通过预测函数和模型在测试集上的表现来评估模型的性能。
def predict(X, w, b):
A = forward_propagation(X, w, b)
predictions = np.where(A > 0.5, 1, 0)
return predictions
逻辑回归是机器学习领域中的一块基石,虽然看似简单,但通过深入理解其背后的反向传播与梯度下降算法,我们不仅能掌握如何从零开始实现它,还能为理解更加复杂的模型打下坚实的基础。希望本文的详细讲解,能帮助你在机器学习的道路上迈出坚实的一步。