首页
/ 从零实现逻辑回归算法:homemade-machine-learning项目解析

从零实现逻辑回归算法:homemade-machine-learning项目解析

2025-07-05 06:01:28作者:董斯意

逻辑回归是机器学习中最基础且重要的分类算法之一。本文将通过分析homemade-machine-learning项目中的逻辑回归实现,深入讲解其核心原理和实现细节。

逻辑回归类结构

该实现将逻辑回归封装为一个Python类LogisticRegression,主要包含以下核心方法:

  1. 构造函数__init__():初始化模型参数
  2. train():训练模型
  3. predict():使用训练好的模型进行预测
  4. 静态方法:gradient_descent()gradient_step()cost_function()hypothesis()

核心实现解析

1. 数据预处理

在构造函数中,通过prepare_for_training函数对输入数据进行预处理:

data_processed, mean, deviation = prepare_for_training(
    data, 
    polynomial_degree, 
    sinusoid_degree, 
    normalize_data
)

预处理包括:

  • 添加偏置项(1的列)
  • 多项式特征生成(可选)
  • 正弦特征生成(可选)
  • 数据标准化(可选)

2. 多分类实现

该实现采用"一对多"(One-vs-All)策略处理多分类问题:

for label_index, unique_label in enumerate(self.unique_labels):
    current_labels = (self.labels == unique_label).astype(float)
    # 为每个类别训练一个二分类器

对于每个类别,将标签转换为二元形式(属于该类为1,不属于为0),然后训练一个独立的逻辑回归模型。

3. 梯度下降优化

使用SciPy的minimize函数实现梯度下降优化:

minimize(
    lambda current_theta: LogisticRegression.cost_function(...),
    initial_theta,
    method='CG',  # 共轭梯度法
    jac=lambda current_theta: LogisticRegression.gradient_step(...),
    callback=...,
    options={'maxiter': max_iteration}
)

关键点:

  • 使用共轭梯度法(CG)进行优化
  • 自定义成本函数和梯度计算
  • 通过回调函数记录成本历史

4. 成本函数实现

逻辑回归的成本函数(带正则化项)实现:

# 正例部分的成本
y_is_set_cost = labels[labels == 1].T @ np.log(predictions[labels == 1])

# 负例部分的成本
y_is_not_set_cost = (1 - labels[labels == 0]).T @ np.log(1 - predictions[labels == 0])

# 正则化项(不包括θ₀)
theta_cut = theta[1:, [0]]
reg_param = (lambda_param / (2 * num_examples)) * (theta_cut.T @ theta_cut)

# 总成本
cost = (-1 / num_examples) * (y_is_set_cost + y_is_not_set_cost) + reg_param

5. 预测过程

预测时计算每个类别的概率,选择概率最高的类别作为预测结果:

probability_predictions = LogisticRegression.hypothesis(data_processed, self.thetas.T)
max_probability_indices = np.argmax(probability_predictions, axis=1)

算法特点

  1. 正则化支持:通过lambda_param参数控制L2正则化强度
  2. 特征工程:支持多项式特征和正弦特征扩展
  3. 数值稳定性:使用sigmoid函数确保预测值在(0,1)区间
  4. 优化效率:利用SciPy的高效优化算法而非手动实现梯度下降

使用示例

# 初始化模型
model = LogisticRegression(
    training_data, 
    training_labels,
    polynomial_degree=2,  # 添加二次多项式特征
    normalize_data=True   # 标准化特征
)

# 训练模型
thetas, cost_histories = model.train(lambda_param=0.1, max_iterations=1000)

# 进行预测
predictions = model.predict(test_data)

总结

这个逻辑回归实现展示了机器学习算法的几个关键方面:

  • 清晰的模块化设计
  • 完整的训练流程
  • 灵活的特征处理
  • 高效的最优化实现
  • 完整的多分类支持

通过研究这个实现,可以深入理解逻辑回归算法的工作原理及其实际实现细节,为进一步学习更复杂的机器学习算法打下坚实基础。