news 2026/4/23 5:00:29

Python实现简单线性回归:从原理到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python实现简单线性回归:从原理到实战

1. 从零实现Python简单线性回归

线性回归是统计学中最基础也最常用的预测方法之一,它的历史可以追溯到200多年前。虽然现在有各种现成的机器学习库可以直接调用,但理解其底层实现原理对于真正掌握机器学习至关重要。今天,我将带你从零开始,用纯Python实现简单线性回归算法。

简单线性回归特别适合机器学习初学者,因为它:

  • 只需要基本的统计学知识
  • 计算过程直观易懂
  • 能帮助你理解更复杂模型的基础
  • 在实际业务中仍有广泛应用

提示:简单线性回归适用于只有一个自变量和一个因变量的情况,当变量增多时就变成了多元线性回归。

2. 核心原理与数学基础

2.1 线性回归模型表达

简单线性回归模型的数学表达式为:

y = b₀ + b₁x

其中:

  • y 是因变量(要预测的值)
  • x 是自变量(特征)
  • b₀ 是截距(y轴交点)
  • b₁ 是斜率(回归系数)

我们的目标是根据训练数据找到最佳的b₀和b₁,使得预测值与实际值的误差最小。

2.2 系数求解原理

系数b₁和b₀可以通过以下公式计算:

b₁ = Σ[(xᵢ - x̄)(yᵢ - ȳ)] / Σ(xᵢ - x̄)²
b₀ = ȳ - b₁x̄

其中:

  • x̄和ȳ分别是x和y的均值
  • Σ表示求和运算

这两个公式的推导基于最小二乘法原理,即找到使预测误差平方和最小的直线。

3. 基础统计函数实现

3.1 计算均值

均值是最基础的统计量,计算一组数的平均值:

def mean(values): return sum(values) / float(len(values))

这个函数接受一个数字列表,返回它们的算术平均值。使用float()确保在Python 2和3中都能得到浮点数结果。

3.2 计算方差

方差衡量数据的离散程度,计算每个数据点与均值差的平方和:

def variance(values, mean_val): return sum([(x - mean_val)**2 for x in values])

这里我们传入预先计算好的均值,避免在函数内重复计算。列表推导式使代码更简洁高效。

4. 协方差与回归系数

4.1 协方差计算

协方差衡量两个变量的联合变化程度:

def covariance(x, mean_x, y, mean_y): covar = 0.0 for i in range(len(x)): covar += (x[i] - mean_x) * (y[i] - mean_y) return covar

协方差为正表示两变量同向变化,为负表示反向变化。在回归分析中,它帮助我们理解x和y之间的关系强度。

4.2 计算回归系数

结合前面实现的函数,现在可以计算回归系数:

def coefficients(dataset): x = [row[0] for row in dataset] y = [row[1] for row in dataset] x_mean, y_mean = mean(x), mean(y) b1 = covariance(x, x_mean, y, y_mean) / variance(x, x_mean) b0 = y_mean - b1 * x_mean return [b0, b1]

这个函数完成了以下工作:

  1. 分离出自变量x和因变量y
  2. 计算各自的均值
  3. 利用公式求解b₁和b₀
  4. 返回回归系数

5. 模型预测与评估

5.1 实现预测函数

有了回归系数,就可以对新数据进行预测:

def simple_linear_regression(train, test): predictions = [] b0, b1 = coefficients(train) for row in test: yhat = b0 + b1 * row[0] predictions.append(yhat) return predictions

这个函数接受训练集和测试集,先用训练集计算系数,然后对测试集的每个x值进行预测。

5.2 评估模型性能

使用均方根误差(RMSE)评估模型预测效果:

from math import sqrt def rmse_metric(actual, predicted): sum_error = 0.0 for i in range(len(actual)): prediction_error = predicted[i] - actual[i] sum_error += (prediction_error ** 2) mean_error = sum_error / float(len(actual)) return sqrt(mean_error)

RMSE越小表示预测越准确。相比均方误差(MSE),RMSE的单位与原始数据一致,更易解释。

6. 完整案例演示

6.1 小型测试数据集

我们先用一个简单的数据集测试我们的实现:

dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] b0, b1 = coefficients(dataset) print(f'Coefficients: B0={b0:.3f}, B1={b1:.3f}') # 预测测试 test_set = [[row[0]] for row in dataset] # 只取x值 predictions = simple_linear_regression(dataset, test_set) print('Predictions:', [round(p, 2) for p in predictions]) # 评估 actual = [row[1] for row in dataset] rmse = rmse_metric(actual, predictions) print(f'RMSE: {rmse:.3f}')

输出结果:

Coefficients: B0=0.400, B1=0.800 Predictions: [1.2, 2.0, 3.6, 2.8, 4.4] RMSE: 0.693

6.2 瑞典保险数据集实战

现在应用到一个真实数据集 - 瑞典汽车保险索赔数据:

from random import seed from csv import reader # 数据加载和预处理函数 def load_csv(filename): dataset = [] with open(filename, 'r') as file: csv_reader = reader(file) for row in csv_reader: if not row: continue dataset.append([float(item) for item in row]) return dataset # 加载数据 seed(1) # 确保可重复性 filename = 'insurance.csv' dataset = load_csv(filename) # 划分训练测试集(60%训练) train_size = int(0.6 * len(dataset)) train = dataset[:train_size] test = dataset[train_size:] # 准备测试集(保留x,清空y) test_set = [row[:-1] for row in test] # 训练模型并预测 predictions = simple_linear_regression(train, test_set) actual = [row[-1] for row in test] rmse = rmse_metric(actual, predictions) print(f'RMSE: {rmse:.3f}')

输出结果:

RMSE: 33.630

相比基准模型(预测均值的RMSE约81),我们的简单线性回归显著提升了预测精度。

7. 关键问题与优化建议

7.1 常见问题排查

  1. 数据格式问题

    • 确保CSV文件格式正确
    • 检查数据中的异常值和缺失值
    • 欧洲数据注意小数点是逗号还是点
  2. 模型表现不佳

    • 检查变量间是否确实存在线性关系
    • 绘制散点图直观查看数据分布
    • 考虑数据标准化/归一化
  3. 代码错误

    • 验证统计计算是否正确
    • 检查系数符号是否符合预期
    • 确保训练/测试集划分合理

7.2 性能优化方向

  1. 增加数据量

    • 更多数据通常能提升模型稳定性
    • 考虑数据增强技术
  2. 特征工程

    • 尝试多项式特征扩展
    • 探索交互项和非线性变换
  3. 正则化

    • 对于高维数据,加入L1/L2正则化
    • 防止过拟合,提高泛化能力
  4. 模型扩展

    • 从简单线性回归扩展到多元线性回归
    • 尝试岭回归、Lasso等变体

8. 实际应用建议

  1. 业务解释性

    • 线性回归的最大优势是结果可解释
    • 向业务方清晰传达系数含义
  2. 快速验证

    • 新项目初期可用作基线模型
    • 快速验证特征与目标的关系
  3. 与其他模型结合

    • 作为集成模型的基学习器
    • 用于特征选择的前置步骤
  4. 监控与更新

    • 定期重新训练模型
    • 监控系数稳定性

注意:虽然现在深度学习很热门,但在许多结构化数据问题上,线性回归因其简单高效仍是最佳选择之一。不要忽视基础算法的重要性。

9. 扩展学习资源

  1. 推荐数据集

    • 波士顿房价数据集
    • 糖尿病进展数据集
    • 葡萄酒质量数据集
  2. 进阶话题

    • 多元线性回归实现
    • 梯度下降优化方法
    • 正则化技术对比
  3. 相关算法

    • 逻辑回归(分类问题)
    • 多项式回归(非线性关系)
    • 局部加权回归(非参数方法)

实现简单线性回归只是机器学习入门的第一步,但这个过程中学到的统计基础、代码实现和模型评估方法,将为你学习更复杂算法打下坚实基础。建议尝试在不同数据集上应用这个实现,观察模型表现的变化,加深对算法行为的理解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 4:52:17

图分析基础:核心算法与工程实践指南

1. 图分析基础概念解析图分析(Graph Analytics)是一套专门用于研究对象间关系强度与方向的数学工具和方法论。想象一下你正在分析一个社交网络:每个人是一个点,人与人之间的好友关系是连接线。图分析就是帮我们理解这些点和线背后…

作者头像 李华
网站建设 2026/4/23 4:34:53

Docker守护进程配置、cgroup资源隔离与seccomp默认策略——金融生产环境必须禁用的5个默认选项,你关了吗?

第一章:Docker金融安全配置的合规性基线与风险全景在金融行业,容器化部署必须满足《GB/T 35273—2020 信息安全技术 个人信息安全规范》《JR/T 0197—2020 金融行业网络安全等级保护实施指引》及PCI DSS v4.0等强监管要求。Docker本身默认配置存在多项高…

作者头像 李华
网站建设 2026/4/23 4:33:24

阶段1:容器基础(1–2周)完整深度学习方案【20260422】002篇

文章目录 阶段1:容器基础(1–2周)完整深度学习方案 阶段总体定位与学习目标 第一部分:Docker核心原理与基础概念(建议学习时长2天) 1. 容器技术诞生背景与演进历史 2. Docker核心架构 3. 镜像(Image)核心概念 4. 容器(Container)核心概念 5. 仓库(Repository)核心概…

作者头像 李华
网站建设 2026/4/23 4:27:01

Qianfan-OCR惊艳效果:多栏报纸扫描图自动分栏+文字流重建效果

Qianfan-OCR惊艳效果:多栏报纸扫描图自动分栏文字流重建效果 1. 项目概述 Qianfan-OCR是百度千帆推出的开源端到端文档智能多模态模型,基于4B参数的Qwen3-4B语言模型构建。这款模型彻底改变了传统OCR处理流程,将文字识别、版面分析和文档理…

作者头像 李华