新闻中心

【Autoregressive】从0构造一个基于Paddle的自回归模型库

2025-07-16
浏览次数:
返回列表
本文展示基于Paddle构建自回归模型库PaddleAutoregressive的过程。先介绍自回归模型原理,说明其本质为线性模型组合。接着展示基础模块Autoregressive类的搭建,以此封装出AR模型,还介绍了数据读取、模型训练与预测的实现。最后说明将代码封装为库的方法,方便用户通过源码下载、PIP安装和导入使用。项目会持续更新,欢迎交流。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【autoregressive】从0构造一个基于paddle的自回归模型库 -

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)=B(q)u(k)+C(o)v(k)

其中:

  • A(p)y(k)=y(k)+a1y(k1)+a2y(k2)+...+apy(kp)A(p)y(k)=y(k)+a1y(k−1)+a2y(k−2)+...+apy(k−p),B(q)u(k)B(q)u(k)和C(o)v(k)C(o)v(k)类似。
  • yy是因变量
  • uu是自变量
  • vv是扰动项。

特别的,对于最基础的AR模型,可设BB和CC为0,即

A(p)y(k)=0A(p)y(k)=0

A(p)y(k)=y(k)+a1y(k1)+a2y(k2)+...+apy(kp)⇒A(p)y(k)=y(k)+a1y(k−1)+a2y(k−2)+...+apy(k−p)

y(k)=a1y(k1)a2y(k2)...apy(kp)⇒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)        break
0 [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”的方式使用编写后的代码,需要进行如下操作:

  1. 建立一个文件夹
  2. 将代码文件都塞到文件夹内
  3. 和文件夹同级目录下编写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


相关推荐: typescript和哪个语音很像  360手机壁纸怎么改  夸克网盘为什么解析错误  单片机计数程序怎么写  typescript中文怎么读  征信不好如何恢复信誉度 ‌征信不好恢复信誉度的方法  typescript能开发什么  怎么在typescript写原型链  记录仪power灯亮是什么意思  苹果16粉色还有哪些机型  typescript变量是什么  如何测固态硬盘芯片  linux如何打开命令窗口  如何用ftp连接命令行  折叠屏手机好不好,耐不耐用  如何退出数据库命令行  360f4怎么取消百变壁纸  如何设置从固态硬盘启动  为什么学typescript  春运返程如何抢票成功  夸克转存中是什么意思  单身聊天app有哪些软件 2025最靠谱的单身交友软件推荐  如何显示固态硬盘  如何使硬盘升级固态硬盘  typescript怎么使用vue  分享一个稳定的ao3镜像网址  如何把一个命令后台运行  硬件如何执行命令  显卡上面TYPE-C是什么接口  typescript文件怎么打开  如何查看电脑的固态硬盘  什么是unix时间戳  怎么批量烧写单片机  三菱变频器POWER是什么意思  固态硬盘如何测试好坏  学typescript需要什么基础么  j*a怎么用json数组  如何看固态硬盘型号  如何以命令符运行程序  j*a数组怎么比较abc  固态硬盘如何装入机箱  夸克网盘是什么都有吗  跑步机power键是什么意思  ai显示无法找到链接的文件是什么意思  51单片机怎么用flash  区块链的热闹将何去何从?  typescript怎么写react  电瓶车屏幕上显示power是什么意思  负市盈率是什么意思  单片机log怎么看 

搜索