从零实现线性回归算法:homemade-machine-learning项目解析
2025-07-05 06:00:05作者:范靓好Udolf
线性回归是机器学习中最基础也最重要的算法之一,它通过建立特征与目标变量之间的线性关系来进行预测。本文将深入解析homemade-machine-learning项目中的线性回归实现,帮助读者理解其核心原理和实现细节。
线性回归类结构
该实现将线性回归封装为一个Python类LinearRegression
,主要包含以下组件:
- 初始化方法:负责数据预处理和参数初始化
- 训练方法:执行梯度下降优化
- 预测方法:基于训练好的模型进行预测
- 辅助方法:包括成本函数计算、梯度步进等
数据预处理
在初始化阶段,数据会经过以下处理流程:
def __init__(self, data, labels, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):
data_processed, features_mean, features_deviation = prepare_for_training(
data, polynomial_degree, sinusoid_degree, normalize_data
)
预处理包括三个关键步骤:
- 多项式特征扩展:通过设置
polynomial_degree
可以添加多项式特征,增强模型表达能力 - 正弦特征扩展:
sinusoid_degree
参数允许添加正弦变换特征 - 数据标准化:当
normalize_data
为True时,会对特征进行标准化处理(减去均值,除以标准差)
模型训练过程
训练过程通过梯度下降算法优化模型参数:
def train(self, alpha, lambda_param=0, num_iterations=500):
cost_history = self.gradient_descent(alpha, lambda_param, num_iterations)
return self.theta, cost_history
梯度下降实现
核心的梯度下降算法包含以下关键步骤:
- 预测值计算:使用当前参数θ计算预测值
- 误差计算:预测值与真实标签的差异
- 参数更新:按照学习率α和正则化参数λ更新θ
def gradient_step(self, alpha, lambda_param):
predictions = LinearRegression.hypothesis(self.data, self.theta)
delta = predictions - self.labels
reg_param = 1 - alpha * lambda_param / num_examples
theta = self.theta
theta = theta * reg_param - alpha * (1/num_examples) * (delta.T @ self.data).T
theta[0] = theta[0] - alpha * (1/num_examples) * (self.data[:,0].T @ delta).T
注意第一项参数θ₀(截距项)不需要正则化,因此单独处理。
成本函数
成本函数用于评估模型性能,包含正则化项:
def cost_function(self, data, labels, lambda_param):
delta = LinearRegression.hypothesis(data, self.theta) - labels
theta_cut = self.theta[1:, 0]
reg_param = lambda_param * (theta_cut.T @ theta_cut)
cost = (1 / 2 * num_examples) * (delta.T @ delta + reg_param)
return cost[0][0]
成本函数由两部分组成:
- 预测误差平方和
- L2正则化项(不包括θ₀)
预测功能
训练完成后,可以使用predict
方法进行预测:
def predict(self, data):
data_processed = prepare_for_training(...)[0]
predictions = LinearRegression.hypothesis(data_processed, self.theta)
return predictions
预测前会对输入数据进行与训练数据相同的预处理(多项式扩展、标准化等),确保特征空间一致。
关键实现细节
- 向量化计算:整个实现充分利用NumPy的向量化操作,避免显式循环,提高效率
- 正则化处理:支持L2正则化,防止过拟合
- 特征工程:内置多项式特征和正弦特征扩展能力
- 标准化处理:可选的标准化功能,加速梯度下降收敛
使用建议
- 对于简单线性关系,保持
polynomial_degree=0
和sinusoid_degree=0
- 当特征量纲差异大时,启用
normalize_data=True
- 出现过拟合时,适当增加
lambda_param
值 - 学习率
alpha
通常设置在0.01到0.1之间,可通过观察成本函数下降曲线调整
这个实现清晰地展示了线性回归的核心原理,同时提供了多项式回归和正则化等扩展功能,非常适合学习机器学习基础算法。通过研究这段代码,可以深入理解梯度下降优化、特征工程和模型正则化等关键概念。