【机器学习-线性回归-3】深入浅出:简单线性回归的概念、原理与实现
在机器学习的世界里,线性回归是最基础也是最常用的算法之一。作为预测分析的基石,简单线性回归为我们理解更复杂的模型提供了完美的起点。无论你是机器学习的新手还是希望巩固基础的老手,理解简单线性回归都至关重要。本文将带你全面了解简单线性回归的概念、数学原理以及如何用Python实现它。
1. 什么是简单线性回归?
简单线性回归(Simple Linear Regression)是一种用于建立和描述两个连续变量之间线性关系的统计方法。它假设因变量(目标变量)与一个自变量(预测变量)之间存在线性关系。
核心思想:找到一条最佳拟合直线,能够最好地描述这两个变量之间的关系。这条直线的方程可以表示为:
y = β₀ + β₁x + ε
其中:
- y 是因变量(我们想要预测的值)
- x 是自变量(用于预测的特征)
- β₀ 是截距(y轴截距)
- β₁ 是斜率(每单位x变化引起的y变化)
- ε 是误差项(模型无法解释的随机波动)
2. 简单线性回归的数学原理
2.1 最小二乘法
简单线性回归的核心是通过最小二乘法(Ordinary Least Squares, OLS)来估计回归系数β₀和β₁。最小二乘法的目标是找到使**残差平方和(RSS)**最小的系数。
残差是指实际观测值(yᵢ)与预测值(ŷᵢ)之间的差异:
RSS = Σ(yᵢ - ŷᵢ)² = Σ(yᵢ - (β₀ + β₁xᵢ))²
2.2 系数计算
通过微积分求导,我们可以得到β₀和β₁的闭式解:
斜率(β₁)的计算公式:
β₁ = Σ[(xᵢ - x̄)(yᵢ - ȳ)] / Σ(xᵢ - x̄)²
截距(β₀)的计算公式:
β₀ = ȳ - β₁x̄
其中x̄和ȳ分别是x和y的样本均值。
2.3 模型评估指标
建立模型后,我们需要评估其性能:
-
R平方(R²):表示模型解释的方差比例,范围0-1,越接近1越好
R² = 1 - (RSS/TSS)
其中TSS是总平方和:
TSS = Σ(yᵢ - ȳ)²
-
均方误差(MSE):预测值与实际值差异的平方的平均值
MSE = RSS/n
-
均方根误差(RMSE):MSE的平方根,与目标变量单位相同
3. 简单线性回归的假设
为了确保模型的可靠性,简单线性回归有以下关键假设:
- 线性关系:自变量和因变量之间存在线性关系
- 独立性:观测值之间相互独立(特别是时间序列数据需要注意)
- 同方差性:残差的方差应保持恒定(不应随预测值增加而变化)
- 正态性:对于任何固定的x值,y值呈正态分布
- 无多重共线性:简单线性回归中自动满足(因为只有一个自变量)
- 无自相关:残差之间不应存在相关性
4. Python实现简单线性回归
现在让我们用Python从头实现简单线性回归,并使用scikit-learn进行验证。
4.1 数据准备
import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据
np.random.seed(42)
x = np.random.rand(100) * 10 # 自变量:0-10之间的随机数
y = 2 * x + 3 + np.random.randn(100) * 2 # 因变量:线性关系加上噪声# 可视化数据
plt.scatter(x, y)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('原始数据散点图')
plt.show()
4.2 从零实现简单线性回归
import numpy as np
import matplotlib.pyplot as pltclass SimpleLinearRegression:def __init__(self):self.intercept_ = None # β₀self.coef_ = None # β₁def fit(self, x, y):# 计算均值x_mean = np.mean(x)y_mean = np.mean(y)# 计算协方差和x的方差cov = np.sum((x - x_mean) * (y - y_mean))var = np.sum((x - x_mean) ** 2)# 计算系数self.coef_ = cov / varself.intercept_ = y_mean - self.coef_ * x_meandef predict(self, x):return self.intercept_ + self.coef_ * xdef score(self, x, y):# 计算R平方y_pred = self.predict(x)ss_res = np.sum((y - y_pred) ** 2)ss_tot = np.sum((y - np.mean(y)) ** 2)return 1 - (ss_res / ss_tot)# 生成模拟数据
np.random.seed(42)
x = np.random.rand(100) * 10 # 自变量:0-10之间的随机数
y = 2 * x + 3 + np.random.randn(100) * 2 # 因变量:线性关系加上噪声
# 使用我们的实现
slr = SimpleLinearRegression()
slr.fit(x, y)print(f"截距(β₀): {slr.intercept_:.2f}")
print(f"斜率(β₁): {slr.coef_:.2f}")
print(f"R平方: {slr.score(x, y):.2f}")# 绘制回归线
plt.scatter(x, y)
plt.plot(x, slr.predict(x), color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('手动实现的简单线性回归')
plt.show()
4.3 使用scikit-learn实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score# 生成模拟数据
np.random.seed(42)
x = np.random.rand(100) * 10 # 自变量:0-10之间的随机数
y = 2 * x + 3 + np.random.randn(100) * 2 # 因变量:线性关系加上噪声# 重塑x的形状(n_samples, n_features)
x_reshaped = x.reshape(-1, 1)# 创建并拟合模型
model = LinearRegression()
model.fit(x_reshaped, y)# 输出结果
print(f"截距(β₀): {model.intercept_:.2f}")
print(f"斜率(β₁): {model.coef_[0]:.2f}")# 预测
y_pred = model.predict(x_reshaped)# 评估
print(f"均方误差(MSE): {mean_squared_error(y, y_pred):.2f}")
print(f"R平方: {r2_score(y, y_pred):.2f}")# 可视化
plt.scatter(x, y)
plt.plot(x, y_pred, color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('scikit-learn实现的简单线性回归')
plt.show()
5. 简单线性回归的局限性
虽然简单线性回归很有用,但它也有一些局限性:
- 对异常值敏感:极端值可能显著影响回归线
- 假设线性关系:无法捕捉非线性关系
- 仅适用于单变量:现实问题通常涉及多个预测变量
- 可能欠拟合:对于复杂关系过于简单
6. 实际应用案例
简单线性回归在现实世界中有广泛应用:
- 房价预测:根据房屋面积预测价格
- 销售预测:根据广告支出预测销售额
- 教育研究:根据学习时间预测考试成绩
- 经济分析:根据GDP增长预测就业率
7. 总结
简单线性回归是机器学习中最基础但最重要的算法之一。通过本文,我们了解了:
- 简单线性回归的基本概念和数学原理
- 最小二乘法如何用于估计模型参数
- 模型的假设条件和评估指标
- 如何从零开始实现简单线性回归
- 如何使用scikit-learn库快速实现
- 模型的局限性和实际应用
虽然简单,但线性回归为理解更复杂的模型奠定了坚实的基础。掌握它,你就迈出了成为机器学习实践者的重要一步!
8. 进一步学习
如果你想深入学习线性回归,可以考虑以下方向:
- 多元线性回归(多个自变量)
- 正则化方法(岭回归、Lasso回归)
- 多项式回归(处理非线性关系)
- 逻辑回归(用于分类问题的线性模型)
- 广义线性模型(GLM)
希望这篇博客能帮助你扎实掌握简单线性回归的核心概念和实现方法!
相关文章:
【机器学习-线性回归-3】深入浅出:简单线性回归的概念、原理与实现
在机器学习的世界里,线性回归是最基础也是最常用的算法之一。作为预测分析的基石,简单线性回归为我们理解更复杂的模型提供了完美的起点。无论你是机器学习的新手还是希望巩固基础的老手,理解简单线性回归都至关重要。本文将带你全面了解简单…...

[mysql]窗口函数
目录 窗口函数: 为何要学习窗口函数,与mysql5.7实现语句对比 现在我们介绍一下窗口函数: 函数规则 1序号函数 2分布函数 3前后函数 5其他函数 总结 窗口函数: 首先数据库的迁移是非常慢的,大家学习新特性的时候要考虑自己公司的数据库版本是不是和自己学习的吻合 为何…...

内存四区(栈)
今天我再次学到了有趣的知识,内存四区! 内存四区分为代码区,全局区,栈区,堆区,今天我们详细来讲讲栈区! 内存四区和栈区都是用来存放数据的,而栈区存放的数据具体有两类 1.形参数…...

新零售行业时代:如何用科技驱动传统零售的转型升级
新零售行业时代:如何用科技驱动传统零售的转型升级 “在变化的世界中,唯一不变的是变化本身。” 一、传统零售的困局:当“生存”成为一场鏖战 街角的便利店老板老王,每天凌晨4点起床进货,却在月…...

长途骑行装备攻略:VELO维乐 Angel Revo坐垫伴我畅享旅途
工作忙碌了很久,终于迎来了一个难得的假期。我决定和朋友一起踏上一场长途骑行之旅,远离城市的喧嚣,去寻找那份久违的宁静与自由。这次旅行,不仅是为了旅途风景的放松,更是为了体验一场身体与心灵的挑战。而朋友推荐的…...
WebcamJS中文文档
文章目录 WebcamJS针对Chrome 47及以上版本的重要说明浏览器支持演示示例开源协议快速入门指南配置初始化拍摄照片自定义图像大小裁剪图像翻转图像(镜像模式)冻结/预览图像设置备用SWF文件位置重置(关闭)API 参考自定义事件向服务器提交图像跟踪上传进度包含在现有表单中自…...
用Python做有趣的AI项目1:用 TensorFlow 实现图像分类(识别猫、狗、汽车等)
项目目标 通过构建卷积神经网络(CNN),让模型学会识别图片中是什么物体。我们将使用 CIFAR-10 数据集,它包含 10 类:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。 🛠️ 开发环境与依赖 安装依赖&…...

微软官网Win10镜像下载快速获取ISO文件
如何从微软官网轻松下载win10镜像?win10镜像的下载方式主要包括两种: 目录 一:借助官方工具 二:直接微软官网通过浏览器进行下载。 三:实现方法与步骤: 1:利用微软官方提供的MediaCreationT…...
Python循环结构深度解析与高效应用实践
引言:循环结构在编程中的核心地位 循环结构作为程序设计的三大基本结构之一,在Python中通过while和for-in两种循环机制实现迭代操作。本文将从底层原理到高级应用,全面剖析Python循环机制的使用技巧与优化策略,助您掌握高效迭代的…...
springboot入门-controller层
在 Spring Boot 中,Controller 层是处理 HTTP 请求的核心组件,负责接收客户端请求、调用业务逻辑(Service 层)并返回响应。其核心原理基于 Spring MVC 框架,通过注解驱动的方式实现请求的路由和参数绑定。以下是 Contr…...
SpringBoot技术概述与应用实践
一、SpringBoot简介 SpringBoot是由Pivotal团队开发的一个基于Spring框架的开源框架,旨在简化Spring应用的开发与部署。它通过约定大于配置的理念,减少了配置复杂性,并通过内嵌式服务器的支持,使得开发者可以更方便地创建独立运行…...

逆向|dy|a_bogus|1.0.1.19-fix.01
2025-04-26 请求地址:aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQV96azV6NkoyMG1YeGt0eHBnNkkzRVRKejlyMEs3d2Y2dU9EWlhvd2ttblZWRnB0dlBPMmMwN2J0WFotcVU4V3M 个人主页的视频数据 我们需要逆向这个接口,所以现在需要分析这个请求, 分析这几个数据包可以发现: 只有…...
golang的cgo的一点小心得
最后有个项目需要涉及到cgo,在这块以前用的不多, 这次略微用得深入了一点,记下来几点以备以后使用 本质上cgo去用的时候就是遵守一些ABI而已,总体而言,尽量避免复杂结构的来回传递。1 对于变长参数,只有…...
第三方测试机构如何保障软件质量并节省企业成本?
在软件行业,第三方测试机构扮演着极其重要的角色。他们提供独立且专业的测试服务,目的是为了保障软件的质量以及提升用户的使用体验。 专业独立 测试机构拥有经验丰富的测试员和严谨的测试流程。他们会对软件各项功能进行细致检验,力求不放…...

高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
目录 思路"情境 对象 问题"型 课题选题的类型有哪些呢?这要从课题题目的构成说起。通过对历年来国家社会科学基金立项项目进行分析,小编发现,课题选题类型非常丰富,但一般是围绕限定词、研究对象和研究问题进行不同的组…...

springboot项目配置nacos,指定使用环境
遇到这样一个问题,在开发、测试、生成环境之间切换的问题。 大多数的操作是通过修改spring.profiles.active来确定指向使用的环境配置文件,对应项目中需要增加对应的配置文件。 但是现在几乎所有公司都会有代码管理不管是SVN、git,这样就会涉…...

DIFY 浅尝 - DIFY + Ollama 添加模型
准备物料 Dify 本地部署 Ollama 下载 Open WebUI 好了现在,假设访问 http://localhost/apps 应该可以打开 Dify,设置用户登录后应该可以看到以下界面 打开 http://localhost:3000/, 你应该可以看到部署好的Open WebUI,并假设有下载好你感…...
高级 SQL 技巧:提升数据处理能力的实用方法
在数据驱动的时代,SQL 作为操作和管理关系型数据库的标准语言,其重要性不言而喻。基础的 SQL 语句能满足日常的数据查询需求,但在处理复杂业务逻辑、进行数据分析和优化数据库性能时,就需要掌握一些高级 SQL 技巧。这些技巧不仅能提高查询效率,还能实现复杂的数据处理任务…...

Java 异常处理全解析:从基础到自定义异常的实战指南
Java 异常处理全解析:从基础到自定义异常的实战指南 一、Java 异常体系:Error 与 Exception 的本质区别 1. 异常体系核心架构 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许…...

开源AI智能名片链动2+1模式S2B2C商城小程序源码赋能下的社交电商创业者技能跃迁与价值重构
摘要:在移动互联网深度重构商业生态的背景下,社交电商创业者面临流量成本攀升、用户粘性不足、供应链协同低效等核心痛点。本文以“开源AI智能名片链动21模式S2B2C商城小程序源码”技术体系为研究对象,通过分析其技术架构、商业逻辑及实战案例…...
线程池(六):ThreadLocal相关知识详解
线程池(六):ThreadLocal相关知识详解 线程池(六):ThreadLocal相关知识详解一、概述定义与作用应用场景 二、ThreadLocal基本使用创建ThreadLocal对象设置和获取值初始化值完整示例 三、ThreadLocal的实现原…...

WSL 中 nvidia-smi: command not found的解决办法
前言 在使用基于 Linux 的 Windows 子系统(WSL)时,当我们执行某些操作后,可能会遇到输入 nvidia-smi 命令却无法被系统识别的情况。 例如,在终端中输入nvidia-smi 后,系统返回提示 -bash: nvidia-smi: co…...

FPGA前瞻篇-组合逻辑电路设计-多路复用器
多路选择器(MUX)简介 基本概念 多路选择器(MUX,Multiplexer)是一种多输入、单输出的组合逻辑电路。 它通过选择控制信号,在多个输入信号中选择一个连接到输出端。 可以理解为一个多路数字开关。 &…...
作为高速通道光纤传输模式怎么理解以及到底有哪些?
光纤的传输模式主要取决于光纤的结构(如纤芯直径和折射率分布),不同模式对应光波在光纤中传播的不同路径和电磁场分布。以下是光纤传输模式的主要分类及特点: 1. 单模光纤(Single-Mode Fiber, SMF) 核心特点: 纤芯直径极小(通常为 8-10微米),仅允许光以单一模式(…...

【Castle-X机器人】五、物联网模块配置与调试
持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】五、物联网模块配置与调试 五、物联网模块配置与调试5.1 物联网模块调试物联网模块测试:控制物联网模块:物联网模块话题五、物联网模块配置与调试 5.1 物联网模块调试 调试前需确保Castle-x与mqtt主机服务器处于同…...
马架构的Netty、MQTT、CoAP面试之旅
标题:马架构的Netty、MQTT、CoAP面试之旅 在互联网大厂的Java求职者面试中,一位名叫马架构的资深Java架构师正接受着严格的考验。他拥有十年的Java研发经验和架构设计经验,尤其对疑难问题和线索问题等有着丰富的经历。 第一轮提问ÿ…...

20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件
20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件 2025/4/26 21:30 缘起:使用NanoPi NEO开发板,编译FriendlyCore系统,打包eMMC固件的时候报错。 1、在ubuntu14.04下git clone异常该如何处理呢ÿ…...

JAVA---字符串
ctrlN 搜索界面(idea) API和API帮助文档 API : 应用程序编程接口(换句话说,就是别人已经写好了,我们不需要再编写,直接使用即可) Java API :就是JDK中提供的各种功能…...

MacOS 10.15上能跑大语言模型吗?
MacOS 10.15上能跑大语言模型吗? 下载安装Ollama运行大语言模型引申出的问题 MacOS 10.15.7(发布于2020年9月)作为已经发布了将近5年的系统版本能够运行当今流行的大语言模型吗?这篇文章简要介绍了在MacOS 10.15上通过Ollama运行d…...

AI Agent开发第37课-DeepSeek的多模态版JanusPro-7B本地安装
开篇 搜遍Janus Pro git issues、谷哥、国内网络,教程全都是错的。因此还是决定写一本全网唯一正确的教程。 目前网上的教程包括外网的教程都是“缺斤少量”,按照那些教程操作下来不是装不起来,就是装起来只能CPU运行,或者运行起来了Janus的Web前端老是转啊转不出内容。 …...