新闻中心
【Autoregressive】从0构造一个基于Paddle的自回归模型库
本文展示基于Paddle构建自回归模型库PaddleAutoregressive的过程。先介绍自回归模型原理,说明其本质为线性模型组合。接着展示基础模块Autoregressive类的搭建,以此封装出AR模型,还介绍了数据读取、模型训练与预测的实现。最后说明将代码封装为库的方法,方便用户通过源码下载、PIP安装和导入使用。项目会持续更新,欢迎交流。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

PaddleAutoregressive 从0构造一个基于Paddle的自回归模型库
自回归是一个传统的时间序列方法,已经有很多开源框架集成提供了对应的使用方法。为了更加便利地使用Paddle进行开发,本项目目的是开发一个基于Paddle的自回归时间序列库。
关于Autoregressive
参考百度百科:“自回归模型(英语:Autoregressive model,简称AR模型),是统计上一种处理时间序列的方法,用同一变数例如x的之前各期,亦即x1至xt-1来预测本期xt的表现,并假设它们为一线性关系。因为这是从回归分析中的线性回归发展而来,只是不用x预测y,而是用x预测 x(自己);所以叫做自回归”。
简单来说,自回归模型本质是一种线性模型,即paddle.nn.Linear。迄今为止,自回归模型已经有很多派生,比如ARX、ARMA、ARARX等等,但这些模型仍然可以通过对Lienar进行组合实现。
关于本项目
本项目并非一个库的推广,而是构造一个库的过程的展示。整个内容会比较粗浅,欢迎大家一起学习交流。
PaddleAutoregressive会随着时间(我闲的没事的时候)而不断更新,维护地址为:https://github.com/Liyulingyue/PaddleAutoregressive,如果大家感兴趣欢迎前往提ISSUR或PR。也可以直接在本项目下评论~
内容介绍
本次介绍的内容如下:
- 网络 Autoregressive
- AR模型的实现与训练
- 封装为库(Setup.py的攥写),通过这种方式可以简单的让大家通过“下载源码 - PIP - import”的方式使用代码
自回归模型
参考知乎页面,几个自回归模型的可以看做满足以下格式:
A(p)y(k)=B(q)u(k)+C(o)v(k)
其中:
- A(p)y(k)=y(k)+a1y(k−1)+a2y(k−2)+...+apy(k−p),B(q)u(k)和C(o)v(k)类似。
- y是因变量
- u是自变量
- v是扰动项。
特别的,对于最基础的AR模型,可设B和C为0,即
A(p)y(k)=0
⇒A(p)y(k)=y(k)+a1y(k−1)+a2y(k−2)+...+apy(k−p)
⇒y(k)=−a1y(k−1)−a2y(k−2)−...−apy(k−p)
因而,我们可以实现一个通用的基础模块,并在这个基础模块的基础上不断封装从而实现AR、ARMA、FIR等时间预测模型。
美图云修
商业级AI影像处理工具
50
查看详情
代码
基础模块的搭建
显然,自回归模型是一些Linear层的组合。只需要设定各个输入的阶数,在网络中配置对应的Linear层即可。
In [1]import paddleclass Autoregressive(paddle.nn.Layer):
def __init__(self, y_features, x_features, e_features):
# y_features 是一个整数,是因变量的阶数
# x_features 是一个由整数组成的list,是自变量的阶数,例如有10个自变量,则list的长度为10,每个变量的阶数都可以有所不同
# e_features 是一个整数,误差的阶数
super(Autoregressive, self).__init__()
self.y_features = y_features
self.x_features = x_features
self.e_features = e_features # 构造一个linear_list用于动态构造Linear层
linear_list = [] if y_features != 0:
linear_list.append(paddle.nn.Linear(y_features, 1, bias_attr=True)) for _x in x_features:
linear_list.append(paddle.nn.Linear(_x, 1, bias_attr=True)) if e_features != 0:
linear_list.append(paddle.nn.Linear(e_features, 1, bias_attr=True))
# 将构造好的网络进行组合
self.linear_list = paddle.nn.Sequential(*linear_list) def forward(self, *inputs):
# 自回归模型本质是各个Linear的加法,用0初始化输出变量
output = paddle.to_tensor([0]).astype('float32') # 逐个Linear计算
for i in range(len(self.linear_list)):
output += self.linear_list[i](inputs[i])
return output
如果我们想模拟FIR(Finite Impulse Response)滤波器,只需要对应的设置y_feature = 0,e_features = 0即可。下述代码建立了一个一阶FIR。
In [2]model = Autoregressive(0, [1], 0) x = paddle.to_tensor(1,dtype='float32').reshape([1,1]) model(x)
Tensor(shape=[1, 1], dtype=float32, place=Place(cpu), stop_gradient=False,
[[0.52980936]])
基于Autoregressive构造AR
AR是自回归模型,即仅保留y_features为对应阶数,x_features 设为 [],e_features设为0即可。从用户的角度来说,他们只希望填入y_features,并不像更多的给x_features进行赋值。因而,我们可以进行适当的封装,仅留一个参数给用户输入即可。
In [4]import paddleclass AR(paddle.nn.Layer):
def __init__(self, y_features):
super(AR, self).__init__()
self.y_features = y_features
self.Autoregressive = Autoregressive(y_features, [], 0) def forward(self, *inputs):
# 只有自回归变量y输入,传入inputs和传入inputs[0]都可以
output = self.Autoregressive(inputs[0]) return output
这里也可以通过继承父类的方式实现,考虑到后续的扩展,例如预测隐变量(具体怎么使用Paddle做到还没考虑好),这里优先通过模型组网的方式实现。
In [5]model = AR(5) paddle.summary(model,(5,5))
----------------------------------------------------------------------------
Layer (type) Input Shape Output Shape Param #
============================================================================
Linear-2 [[5, 5]] [5, 1] 6
Autoregressive-2 [[5, 5]] [5, 1] 0
============================================================================
Total params: 6
Trainable params: 6
Non-trainable params: 0
----------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------------------
{'total_params': 6, 'trainable_params': 6}
模型使用
构造数据读取器
数据使用空气质量数据集。
In [9]# 读取数据,复现时请到上述链接中下载文件,解压后,将csv文件放在aistudio目录中import pandas as pdimport numpy as np
df = pd.read_csv('AirQualityUCI.csv', sep=';')
df = df.dropna(how = 'all')
y = df.iloc[:,3].to_list()# 对y进行简单预处理,映射为均值为1的序列y = (np.array(y)/np.array(y).mean()).tolist()
In [10]
import paddleclass MyDateset(paddle.io.Dataset):
def __init__(self, y_list = y, q = 100, mode = 'train'): # q是阶数
super(MyDateset, self).__init__()
self.mode = mode
self.y = y
self.q = q def __getitem__(self, index):
data = self.y[index:index+self.q]
label = self.y[index + self.q]
data = paddle.to_tensor(data, dtype='float32').reshape([self.q])
label = paddle.to_tensor(label, dtype='float32') return data,label def __len__(self):
return len(self.y)-self.qif 1:
train_dataset=MyDateset(y, 100)
train_dataloader = paddle.io.DataLoader(
train_dataset,
batch_size=16,
shuffle=True,
drop_last=False) for step, data in enumerate(train_dataloader):
data, label = data print(step, data.shape, label.shape) break0 [16, 100] [16, 1]
模型训练
In [ ]model = AR(100)
model.train()if 1: try: # 接续之前的模型重复训练
param_dict = paddle.load('./model.pdparams')
model.load_dict(param_dict) except: print('no such model file')
train_dataset=MyDateset(y, 100)
train_dataloader = paddle.io.DataLoader(
train_dataset,
batch_size=64,
shuffle=True,
drop_last=False)
max_epoch=100scheduler = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=0.00001, T_max=max_epoch)
opt = paddle.optimizer.Adam(learning_rate=scheduler, parameters=model.parameters())
now_step=0for epoch in range(max_epoch): for step, data in enumerate(train_dataloader):
now_step+=1
img, label = data
pre = model(img)
loss = paddle.nn.functional.mse_loss(pre, label).mean()
loss.backward()
opt.step()
opt.clear_gradients() if now_step%100==0: print("epoch: {}, batch: {}, loss is: {}".format(epoch, step, loss.mean().numpy()))
paddle.s*e(model.state_dict(), 'model.pdparams')
模型预测
训练好模型后,可以朝后预测。这里给出一个预测100个数据的demo。
In [ ]data = y[-100:]for i in range(100):
input_y = data[i:i+100]
input_y = paddle.to_tensor(input_y).reshape([1,100])
output_y = model(input_y)
data.append(output_y.numpy()[0][0])
构造包
参考简书 - 编写 python package 中的 setup.py 文件
如果希望用户能够通过“pip - import”的方式使用编写后的代码,需要进行如下操作:
- 建立一个文件夹
- 将代码文件都塞到文件夹内
- 和文件夹同级目录下编写setup.py文件
本项目的文件夹路径如下
|- PaddleAutoregressive |- __init__.py # 留空即可 |- AR.py # AR的模型声明,需要从Autoregressive.py中import Autoregressive,打包后import路径要从包名开始 |- Autoregressive.py # 基础模型的声明|-setup.py
setup.py内容如下:
from setuptools import setup, find_packages setup( name='PaddleAutoregressive', packages=find_packages() )
上传至github后,即可让用户从拉取源码,pip install -e .,import的方式使用写好的代码啦~
从Git Clone开始使用Autoregressive
In [ ]# 下载代码! git clone https://github.com/Liyulingyue/PaddleAutoregressive.git %cd ~/PaddleAutoregressive# 安装! pip install -e .In [ ]
%cd ~import PaddleAutoregressive.AR as ARimport paddle model = AR.AR(5) paddle.summary(model,(5,5))
接下来,就可以将AR模型和Paddle模型进行任意组网和训练啦~
以上就是【Autoregressive】从0构造一个基于Paddle的自回归模型库的详细内容,更多请关注其它相关文章!
# git
# 中文网
# 可以通过
# 设为
# 有很多
# 美图
# 一言
# 是一个
# type
# pip安装
# yy
# cos
# csv文件
# 百度
# ai
# python
# udio
# 安阳推广网站建设
# 辽宁抖音推广营销公司有哪些
# 地理网站建设工作内容
# 幼儿园网站建设预算
# 防伪查询网站建设大学
# 龙岗网站建设项目
# 盐城网站推广威新hfqjwl作词
# 阳江抖音seo优化
# seo外链如何计划
# 南昌大站网站建设
# 装出
# 官网
# 只需要
相关栏目:
【
行业资讯67740 】
【
技术百科0 】
【
网络运营39195 】
相关推荐:
如何自己加装固态硬盘
单片机.lib文件怎么打开
a股等权市盈率中位数是什么意思
360手机壁纸怎么改
如何4k对齐固态硬盘
苹果16更新了哪些版本
win7怎么关闭360壁纸屏保
typescript怎么理解的
春运抢票到哪里抢票啊
typescript什么意思
选哪个折叠屏手机好
固态硬盘如何启动
市盈率高是什么意思
固态硬盘如何打开软件
单片机计时程序怎么写
域名批量查询工具有哪些
什么软件能下载夸克视频
春运抢票哪里最火热
自己如何安装固态硬盘
如何编写一个linux命令
如何用命令查看数据库日志文件
如何查看win10版本命令行
awk命令如何对两列加分隔符
虚拟机服务器如何关机命令
苹果16系统多了哪些
如何固态硬盘4k对齐
360n7lite怎么设置动态壁纸
手机拍电脑屏幕有条纹怎么解决
破太岁是什么意思
单片机软件keil怎么运行
r中如何逐行执行命令
春运抢票最快几天能成功
免费恢复删除的微信聊天记录软件有哪些
新买的固态硬盘如何查
摩托车上power是什么意思
i5 6500怎么装win7
typescript如何定义常量
debian和ubuntu命令一样吗
建伍遥控器power是什么意思
阿里云手机云盘怎么用_阿里云盘苹果手机怎么用教程
位置控制单片机怎么用的
命令行如何启动应用程序
如何学好typescript
mac 如何启动命令行模式
折叠屏手机为什么有黑点
kingston是什么_kingston是什么意思
如何选购ssd固态硬盘
固态硬盘 如何分区
ftp$如何执行宏命令
typescript文件怎么打开


2025-07-16
浏览次数:次
返回列表
loss.backward()
opt.step()
opt.clear_gradients() if now_step%100==0: print("epoch: {}, batch: {}, loss is: {}".format(epoch, step, loss.mean().numpy()))
paddle.s*e(model.state_dict(), 'model.pdparams')