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

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

2025-07-05 06:00:05作者:范靓好Udolf

线性回归是机器学习中最基础也最重要的算法之一,它通过建立特征与目标变量之间的线性关系来进行预测。本文将深入解析homemade-machine-learning项目中的线性回归实现,帮助读者理解其核心原理和实现细节。

线性回归类结构

该实现将线性回归封装为一个Python类LinearRegression,主要包含以下组件:

  1. 初始化方法:负责数据预处理和参数初始化
  2. 训练方法:执行梯度下降优化
  3. 预测方法:基于训练好的模型进行预测
  4. 辅助方法:包括成本函数计算、梯度步进等

数据预处理

在初始化阶段,数据会经过以下处理流程:

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
    )

预处理包括三个关键步骤:

  1. 多项式特征扩展:通过设置polynomial_degree可以添加多项式特征,增强模型表达能力
  2. 正弦特征扩展sinusoid_degree参数允许添加正弦变换特征
  3. 数据标准化:当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

梯度下降实现

核心的梯度下降算法包含以下关键步骤:

  1. 预测值计算:使用当前参数θ计算预测值
  2. 误差计算:预测值与真实标签的差异
  3. 参数更新:按照学习率α和正则化参数λ更新θ
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]

成本函数由两部分组成:

  1. 预测误差平方和
  2. L2正则化项(不包括θ₀)

预测功能

训练完成后,可以使用predict方法进行预测:

def predict(self, data):
    data_processed = prepare_for_training(...)[0]
    predictions = LinearRegression.hypothesis(data_processed, self.theta)
    return predictions

预测前会对输入数据进行与训练数据相同的预处理(多项式扩展、标准化等),确保特征空间一致。

关键实现细节

  1. 向量化计算:整个实现充分利用NumPy的向量化操作,避免显式循环,提高效率
  2. 正则化处理:支持L2正则化,防止过拟合
  3. 特征工程:内置多项式特征和正弦特征扩展能力
  4. 标准化处理:可选的标准化功能,加速梯度下降收敛

使用建议

  1. 对于简单线性关系,保持polynomial_degree=0sinusoid_degree=0
  2. 当特征量纲差异大时,启用normalize_data=True
  3. 出现过拟合时,适当增加lambda_param
  4. 学习率alpha通常设置在0.01到0.1之间,可通过观察成本函数下降曲线调整

这个实现清晰地展示了线性回归的核心原理,同时提供了多项式回归和正则化等扩展功能,非常适合学习机器学习基础算法。通过研究这段代码,可以深入理解梯度下降优化、特征工程和模型正则化等关键概念。