当前位置: 首页 > news >正文

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+

  • 时间序列在回归预测的领域的重要性,不言而喻,在数学建模中使用及其频繁,但是你真的了解ARIMA、AR、MA么?ACF图你会看么?? 时间序列数据如何构造???,我打过不少数学建模,但是都没有弄得很清楚;
  • 这篇将详细讲解了基础模型—AR的原理.

文章目录

  • 1、自回归(AR)详解
    • 1、简要说明
    • 2、原理讲解
    • 3、ACF图
  • 2、案例
    • 1、数据预处理
      • 1、导入库
      • 2、读取数据且预处理
    • 2、实现自回归模型
    • 3、模型预测
    • 4、数据分析和可视化
      • 1、原始数据时间序列图
      • 2、训练集和测试集的预测结构对比图
      • 3、残差分析
      • 4、正相关(ACF)
    • 5、结果分析

1、自回归(AR)详解

1、简要说明

  • 什么是自回归??

自回归:通过过去的数据预测当下的数据,是一个时间序列的基础模型,但是很有效,能够有效的捕捉数据随着时间的变化趋势。

  • 举例解释:

在日常生活中,我们知道一般情况下,当下的气温和前几天的温度是有关系的,比如说这3天很热,明天大概率也会很热,自回归(AR)就是这样的模型,通过前几天的气温预测今天的气温,如:

  1. 今天:20度,记为a,前天:18度,记为b,大前天:22度,记为c,需要预测明天的气温
  2. 明天气温 = k1 * a + k2 * b + k3* c + 随机误差, k1 、 k2 、k3 是权重,这个可以通过计算得出。

2、原理讲解

自回归公式(很像多元线性回归):

y t = c + ϕ 1 y t − 1 + ϕ 2 y t − 2 + ⋯ + ϕ p y t − p + ϵ t y_t=c+\phi_1y_{t-1}+\phi_2y_{t-2}+\cdots+\phi_py_{t-p}+\epsilon_t yt=c+ϕ1yt1+ϕ2yt2++ϕpytp+ϵt

  • ϕ p \phi_p ϕp这是自回归系数,表示当下p个时间点的数据对要预测的yt 这个时间点的重要程度;
  • c:常数项,就如我们一元回归方差,y = ax + b中的那个b
  • ϵ t \epsilon_t ϵt:误差项,用来随机生成数据,模拟波动,让预测效果更加贴近实际;
  • p:滞后阶数,表示用前p个数来预测当前的数据。

通过自回归公式,我当时一眼一看,这不就是多元线性回归么?实际也确实是,只是他添加类误差项而已,实际求解的时候,也是通过最小二乘回归求解系数的。

下面是一个用自回归去探究气温的一组案例,需要关注点有两个如下:

  • 怎么构造时间数据???
  • 怎么利用最小二乘回归去求解系数???

3、ACF图

通过查看数的ACF图,在不同用领域有不同的用处,如下:

  • 白噪声过程:时间序列是随机的,没有可预测的结构,即数据之间没有关系。
  • 模型拟合良好:模型已经很好地捕捉了数据中的所有相关信息,残差是随机的。
  • 数据本身没有自相关性:数据中的每个观测值都是独立的没有时间上的依赖关系。
  • 数据预处理的影响:预处理有效地去除了数据中的自相关性

2、案例

数据:该数据描述的是这几百年的地球平均气温,下载地址:kaggle;

目的:大陆平均气温数据的探究,更加理解AR原理以及数学公式。

1、数据预处理

1、导入库

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from sklearn.model_selection import train_test_split

2、读取数据且预处理

data_df = pd.read_csv('GlobalTemperatures.csv')
data_df
dtLandAverageTemperatureLandAverageTemperatureUncertaintyLandMaxTemperatureLandMaxTemperatureUncertaintyLandMinTemperatureLandMinTemperatureUncertaintyLandAndOceanAverageTemperatureLandAndOceanAverageTemperatureUncertainty
01750-01-013.0343.574NaNNaNNaNNaNNaNNaN
11750-02-013.0833.702NaNNaNNaNNaNNaNNaN
21750-03-015.6263.076NaNNaNNaNNaNNaNNaN
31750-04-018.4902.451NaNNaNNaNNaNNaNNaN
41750-05-0111.5732.072NaNNaNNaNNaNNaNNaN
..............................
31872015-08-0114.7550.07220.6990.1109.0050.17017.5890.057
31882015-09-0112.9990.07918.8450.0887.1990.22917.0490.058
31892015-10-0110.8010.10216.4500.0595.2320.11516.2900.062
31902015-11-017.4330.11912.8920.0932.1570.10615.2520.063
31912015-12-015.5180.10010.7250.1540.2870.09914.7740.062

3192 rows × 9 columns

# 只保留日期和LanAverageTemperatrue
data_df = data_df[['dt', 'LandAverageTemperature']]
# 查看数据信息
data_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3192 entries, 0 to 3191
Data columns (total 2 columns):#   Column                  Non-Null Count  Dtype  
---  ------                  --------------  -----  0   dt                      3192 non-null   object 1   LandAverageTemperature  3180 non-null   float64
dtypes: float64(1), object(1)
memory usage: 50.0+ KB
# 缺失值较少,采用前置填充方法
data_df = data_df.fillna(method='ffill')
# 时间转化为datatime格式
data_df['dt'] = pd.to_datetime(data_df['dt'])
# 按照日期排序,确保日期按照顺序
data_df = data_df.sort_values(by='dt')
# 设置日期索引,方便快速查询
data_df.set_index('dt', inplace=True)# 为了更方便后面展示,这里选取最近1000条数据,全部展示,后面绘图,全都堆到一起
data_df = data_df.tail(1000)

2、实现自回归模型

# 深刻理解代码
def create_lagged_features(data, lag):x = []y = []for i in range(lag, len(data)):x.append(data[i - lag : i])y.append(data[i])return np.array(x), np.array(y)
# 使用 5 阶(联系数学公式) 自回归模型
lag = 5
# 提取特征值,目标值(也就是自变量,因变量)
all_temperature_data = data_df['LandAverageTemperature'].values
# 获取自变量、因变量
X, Y = create_lagged_features(all_temperature_data, lag)
# 分割数据集
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

在实际应用中,我们通常会先添加常数项,然后再计算回归系数,因为这样可以保证模型能够捕捉到数据的全局趋势。

# 使用最小二乘法拟合 自回归 模型
def fit_regresiion(x_train, y_train):# 添加常数项, b(结合公式),添加一项,为了适应维度x_train = np.c_[np.ones(x_train.shape[0]), x_train]# 计算回归系数,结合公式 np.linalg.inv 求逆beta = np.linalg.inv(x_train.T @ x_train) @ x_train.T @ y_trainreturn beta
# 拟合,得到回归系数
beta = fit_regresiion(x_train, y_train)
beta

输出:

array([ 5.07449781, -0.04255702, -0.22825367, -0.2961153 ,  0.06135681,0.93721175])

3、模型预测

def predict_ar_model(x, beta):# 添加常数项x = np.c_[np.ones(x.shape[0]), x]  # 添加常数项# 预测y_pred = x @ beta   # 自己相乘,结合公式return y_pred# 测试集、训练集测试
y_pred_train = predict_ar_model(x_train, beta)
y_predict_test = predict_ar_model(x_test, beta)

4、数据分析和可视化

1、原始数据时间序列图

plt.figure(figsize=(10, 6))
plt.plot(data_df.index, data_df['LandAverageTemperature'], color='orange', label='Temperature')
plt.title('Global Land Average Temperature Over Time')
plt.xlabel('Year')
plt.ylabel('Temperature')
plt.legend()
plt.grid(True)
plt.show()


在这里插入图片描述

2、训练集和测试集的预测结构对比图

plt.figure(figsize=(10, 6))
plt.plot(y_train, label='Actual Train', color='blue')
plt.plot(y_pred_train, label='Predicr Train', color='red', linestyle='dashed')
plt.title('AR Model')
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.grid(True)
plt.show()plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual Test', color='blue')
plt.plot(y_predict_test, label='Predicr Test', color='red', linestyle='dashed')
plt.title('AR Model')
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.grid(True)
plt.show()


在这里插入图片描述

在这里插入图片描述

3、残差分析

残差图分析误差

residual = y_test - y_predict_test   # 残差计算
plt.figure(figsize=(10, 6))
plt.plot(residual, color='green', label='Residual')
plt.title('Residual of AR on Test Data')
plt.xlabel('Time')
plt.ylabel('Residual')
plt.legend()
plt.grid(True)
plt.show()


在这里插入图片描述

4、正相关(ACF)

检查残差的自相关性,查看是存在未捕捉时间特征

from statsmodels.graphics.tsaplots import plot_acfplt.figure(figsize=(10, 6))
plot_acf(residual, lags=50)   # 展示前50个滞后
plt.title('ACF OF RESIDUAL')
plt.grid(True)
plt.show()
<Figure size 1000x600 with 0 Axes>

在这里插入图片描述

  • 默认置信区间,显著性水平是5%
  • acf图中,值接近为0,几乎全在置信区间内,说明残差数据之间没有关系,残差是随机的,模型有效的捕捉到了时间特征

5、结果分析

from sklearn.metrics import mean_squared_error, r2_scoremse = mean_squared_error(y_test, y_predict_test)
r2 = r2_score(y_test, y_predict_test)print('mse: ', mse)
print('r2', r2)
mse:  0.19718326089184698
r2 0.9889418324562267
  • 综上说明模型有效挖掘了天气的规律

相关文章:

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+

时间序列在回归预测的领域的重要性&#xff0c;不言而喻&#xff0c;在数学建模中使用及其频繁&#xff0c;但是你真的了解ARIMA、AR、MA么&#xff1f;ACF图你会看么&#xff1f;&#xff1f; 时间序列数据如何构造&#xff1f;&#xff1f;&#xff1f;&#xff0c;我打过不少…...

回溯算法之值子集和问题详细解读(附带Java代码解读)

子集和问题&#xff08;Subset Sum Problem&#xff09; 是一个经典的组合优化问题。问题可以这样描述&#xff1a; 给定一个整数集合和一个目标整数 target&#xff0c;我们需要从集合中选出若干个整数&#xff0c;使它们的和等于 target。如果这样的子集存在&#xff0c;返回…...

mysql游标的使用

说明&#xff1a; 虽然我们也可以通过筛选条件 WHERE 和 HAVING&#xff0c;或者是限定返回记录的关键字 LIMIT 返回一条记录&#xff0c;但是&#xff0c;却无法在结果集中像指针一样&#xff0c;向前定位一条记录、向后定位一条记录&#xff0c;或者是 随意定位到某一条记录 …...

linux udev详解

1.概念介绍 1.1sysfs文件系统 Linux 2.6以后的内核引入了sysfs文件系统&#xff0c;sysfs被看成是与proc、devfs和devpty同类别的文件系统&#xff0c;该文件系统是一个虚拟的文件系统&#xff0c;它可以产生一个包括所有系统硬件的层级视图&#xff0c;与提供进程和状态信息…...

EventSource和websocket该用哪种技术

EventSource&#xff08;也称为Server-Sent Events, SSE&#xff09;和WebSocket都是实现实时通信的技术&#xff0c;但是它们的设计目的和使用场景有所不同。在选择使用哪种技术时&#xff0c;需要根据具体的应用需求来决定。下面是一些关键点&#xff0c;可以帮助你做出选择&…...

通信工程学习:什么是三网融合

三网融合 三网融合&#xff0c;又称“三网合一”&#xff0c;是指电信网、广播电视网、互联网在高层业务应用上的深度融合。这一概念在近年来随着信息技术的快速发展而逐渐受到重视&#xff0c;并成为推动信息化社会建设的重要力量。以下是对三网融合的详细解释&#xff1a; 一…...

自定义类型结构体(上)

目录 结构体类型的声明结构体的概念结构体的声明特殊的声明结构的自引用 结构体变量的创建和初始化结构成员访问操作符 结构体类型的声明 结构体的概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 举个例子:杰克的英语只考了6…...

b站-湖科大教书匠】4 网络层 - 计算机网络微课堂

【b站-湖科大教书匠】4 网络层 - 计算机网络微课堂_湖科大的计算机网络网课-CSDN博客...

国际 Android WPS Office v18.13 解锁版

WPS Office 移动版&#xff0c;设计不断优化&#xff0c;性能再次提升&#xff01;融入Google Android最新设计标准&#xff0c;Material Design设计风格&#xff0c;完美支持沉浸式&#xff01;简化文档操作&#xff0c;全新移动办公力作。全新界面更清晰舒适&#xff0c;功能…...

【中间件学习】Git的命令和企业级开发

一、Git命令 1.1 创建Git本地仓库 仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制&#xff0c;就必须创建出一个仓库出来。创建一个Git本地仓库对应的命令是 git init &#xff0c;注意命令要在文件目录下执行。 hrxlavm-1lzqn7w2w6:~/gitcode$ pwd /home/hr…...

FTP连接池与多线程FTP上传下载算法(Java)

设计一个能够处理FTP连接池在多线程环境下,尤其是涉及到故障重连时避免竞争条件的算法,需要综合考虑线程同步、连接状态管理和重试机制。以下是一个设计思路和实现方案: 设计思路 连接池管理: 维护一个连接池,其中包含多个FTP连接对象。每个FTP连接对象需有状态标记(如…...

Spring Cloud微服务详解

Spring Cloud微服务详解 在当今的数字化时代&#xff0c;微服务架构已成为构建大型、复杂应用系统的主流方式。Spring Cloud&#xff0c;作为微服务领域的一颗璀璨明星&#xff0c;以其强大的功能和灵活的架构&#xff0c;吸引了无数开发者的目光。本文将深入探讨Spring Cloud…...

QT学习笔记1.2(QT的应用)

QT原生用于c的开发&#xff0c; 主要应用于电脑、桌面手机桌面软件的开发&#xff0c;主要是widget样式模板。 Qt Widgets、Qt Quick 和 Qt for Python 是 Qt 框架中的三种不同的技术&#xff0c;分别用于不同的应用场景。以下是它们的详细介绍和对比&#xff1a; 1. Qt Widg…...

数学建模算法与应用 第1章 线性规划

第1章 线性规划 线性规划是数学规划领域的重要分支&#xff0c;广泛应用于资源配置、生产计划、物流管理等领域。它主要用于解决如何在满足一定约束条件下&#xff0c;使目标函数&#xff08;如成本、利润等&#xff09;达到最大或最小的问题。第一章将介绍线性规划的基本概念…...

使用 systemd 设置 PHP 程序为服务

使用 systemd 设置 PHP 程序为服务 在现代 Linux 系统中&#xff0c;systemd 是用于管理和控制服务的标准工具。通过 systemd&#xff0c;我们可以轻松地将 PHP 程序配置为后台运行的系统服务&#xff0c;从而实现自动化启动、重启和日志记录等功能。本文将介绍如何为 PHP 程序…...

HRNET模型实现钢板表面缺陷检测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…...

28 基于51单片机的两路电压检测(ADC0808)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过ADC0808获取两路电压&#xff0c;通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROTEUS8.15进行仿真&#xff0c;全部资源在页尾&#xff0c;提供…...

SpringBootTest Mockito 虚实结合编写测试

SpringBootTest & Mockito 虚实结合测试 起因 单一使用mockito&#xff0c;会出现很多mock困难的问题&#xff0c;导致测试编写过程太长&#xff0c;太恶心 单一使用springboottest&#xff0c;会遇到需要外部接口的地方&#xff0c;这个时候就非得去真实调用才行。也很恶…...

国内外网络安全政策动态(2024年9月)

国内网络安全政策动态 ▶︎ 1.三项智能网联汽车强制性国家标准正式发布 9月4日&#xff0c;工业和信息化部组织制定的GB 44495—2024《汽车整车信息安全技术要求》、GB 44496—2024《汽车软件升级通用技术要求》和GB 44497—2024《智能网联汽车 自动驾驶数据记录系统》三项强制…...

使用Android studio进行Unit Test中遇到的问题记录

1、模块本身代码运行不起来 提示&#xff1a; Cannot resolve method ‘getVolumes’ in ‘StorageManager’ Cannot resolve method ‘registerListener’ in ‘StorageManager’ Cannot resolve method ‘unregisterListener’ in ‘StorageManager’ 查看Android 源码&…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...