首页
/ 从零实现逻辑回归算法:TheAlgorithms-Python项目解析

从零实现逻辑回归算法:TheAlgorithms-Python项目解析

2025-07-10 04:15:37作者:劳婵绚Shirley

逻辑回归是机器学习中最基础且广泛应用的分类算法之一。本文将通过分析TheAlgorithms-Python项目中的实现,深入讲解逻辑回归的核心原理和Python实现细节。

逻辑回归基础概念

逻辑回归虽然名称中带有"回归"二字,但实际上是一种用于解决二分类问题的线性模型。它通过sigmoid函数将线性回归的输出映射到(0,1)区间,表示样本属于某一类的概率。

核心数学原理

1. Sigmoid函数

Sigmoid函数(也称为逻辑函数)是逻辑回归的核心,其数学表达式为:

σ(z) = 1 / (1 + e⁻�)

在代码中对应的实现是:

def sigmoid_function(z):
    return 1 / (1 + np.exp(-z))

这个函数将任意实数映射到(0,1)区间,非常适合表示概率。

2. 损失函数

逻辑回归使用交叉熵损失函数(也称为对数损失),其数学表达式为:

J(θ) = -1/m * Σ [yⁱ log(hθ(xⁱ)) + (1-yⁱ) log(1-hθ(xⁱ))]

代码实现如下:

def cost_function(h, y):
    return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()

算法实现解析

项目中的逻辑回归实现采用梯度下降法优化参数,主要包含以下关键步骤:

  1. 初始化参数:θ初始化为零向量
  2. 计算预测值:z = Xθ,然后通过sigmoid函数得到预测概率h
  3. 计算梯度:∇J(θ) = Xᵀ(h-y)/m
  4. 更新参数:θ = θ - α∇J(θ)
  5. 重复迭代直到收敛或达到最大迭代次数

核心实现代码如下:

def logistic_reg(alpha, X, y, max_iterations=70000):
    converged = False
    iterations = 0
    theta = np.zeros(X.shape[1])
    
    while not converged:
        z = np.dot(X, theta)
        h = sigmoid_function(z)
        gradient = np.dot(X.T, h - y) / y.size
        theta = theta - alpha * gradient
        
        z = np.dot(X, theta)
        h = sigmoid_function(z)
        J = cost_function(h, y)
        
        iterations += 1
        
        if iterations == max_iterations:
            print('Maximum iterations exceeded!')
            print('Minimal cost function J=', J)
            converged = True
    
    return theta

实际应用示例

项目中使用经典的鸢尾花数据集进行演示:

iris = datasets.load_iris()
X = iris.data[:, :2]  # 只使用前两个特征
y = (iris.target != 0) * 1  # 转换为二分类问题

alpha = 0.1  # 学习率
theta = logistic_reg(alpha, X, y, max_iterations=70000)

结果可视化

项目还包含了结果可视化的代码,绘制了数据点和决策边界:

plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='b', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='r', label='1')

# 绘制决策边界
(x1_min, x1_max) = (X[:, 0].min(), X[:, 0].max())
(x2_min, x2_max) = (X[:, 1].min(), X[:, 1].max())
(xx1, xx2) = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='black')

关键参数说明

  1. 学习率(alpha):控制参数更新的步长,过大可能导致震荡,过小则收敛慢
  2. 最大迭代次数(max_iterations):防止算法无限循环
  3. 特征选择:示例中只使用了前两个特征,实际应用中需要根据情况选择

算法优缺点

优点

  • 实现简单,计算效率高
  • 输出具有概率意义
  • 对线性可分数据表现良好

缺点

  • 只能处理线性决策边界
  • 对异常值敏感
  • 特征相关性较高时表现不佳

扩展思考

  1. 可以尝试添加正则化项(L1/L2)防止过拟合
  2. 对于多分类问题,可以扩展为softmax回归
  3. 可以尝试不同的优化算法(如牛顿法、拟牛顿法等)替代梯度下降

通过这个项目的实现,我们不仅理解了逻辑回归的数学原理,还掌握了如何用Python从零实现这一经典算法。这种实现方式虽然简单,但包含了算法最核心的思想,是学习机器学习非常好的起点。