从零实现逻辑回归算法:homemade-machine-learning项目解析
2025-07-05 06:01:28作者:董斯意
逻辑回归是机器学习中最基础且重要的分类算法之一。本文将通过分析homemade-machine-learning项目中的逻辑回归实现,深入讲解其核心原理和实现细节。
逻辑回归类结构
该实现将逻辑回归封装为一个Python类LogisticRegression
,主要包含以下核心方法:
- 构造函数
__init__()
:初始化模型参数 train()
:训练模型predict()
:使用训练好的模型进行预测- 静态方法:
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)
算法特点
- 正则化支持:通过
lambda_param
参数控制L2正则化强度 - 特征工程:支持多项式特征和正弦特征扩展
- 数值稳定性:使用sigmoid函数确保预测值在(0,1)区间
- 优化效率:利用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)
总结
这个逻辑回归实现展示了机器学习算法的几个关键方面:
- 清晰的模块化设计
- 完整的训练流程
- 灵活的特征处理
- 高效的最优化实现
- 完整的多分类支持
通过研究这个实现,可以深入理解逻辑回归算法的工作原理及其实际实现细节,为进一步学习更复杂的机器学习算法打下坚实基础。