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

本文展示基于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。也可以直接在本项目下评论~

内容介绍

本次介绍的内容如下:

网络 AutoregressiveAR模型的实现与训练封装为库(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(k−1)+a2y(k−2)+…+apy(k−p)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(k−1)+a2y(k−2)+…+apy(k−p)⇒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)⇒y(k)=−a1y(k−1)−a2y(k−2)−…−apy(k−p)

因而,我们可以实现一个通用的基础模块,并在这个基础模块的基础上不断封装从而实现AR、ARMA、FIR等时间预测模型。

可图大模型 可图大模型

可图大模型(Kolors)是快手大模型团队自研打造的文生图AI大模型

可图大模型 32 查看详情 可图大模型

代码

基础模块的搭建

显然,自回归模型是一些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: 6Trainable params: 6Non-trainable params: 0----------------------------------------------------------------------------Input size (MB): 0.00Forward/backward pass size (MB): 0.00Params size (MB): 0.00Estimated Total Size (MB): 0.00----------------------------------------------------------------------------
{'total_params': 6, 'trainable_params': 6}

模型使用

构造数据读取器

数据使用空气质量数据集。

In [9]

# 读取数据,复现时请到上述链接中下载文件,解压后,将csv文件放在aistudio目录中import pandas as pdimport numpy as npdf = 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.save(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_packagessetup(    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 paddlemodel = AR.AR(5)paddle.summary(model,(5,5))

接下来,就可以将AR模型和Paddle模型进行任意组网和训练啦~

以上就是【Autoregressive】从0构造一个基于Paddle的自回归模型库的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/319656.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
excel怎么合并多个工作表_Excel多工作表数据合并与汇总操作流程
上一篇 2025年11月5日 09:22:11
Yandex英文版官方搜索入口_Yandex搜索引擎高级使用技巧
下一篇 2025年11月5日 09:22:17

相关推荐

  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    100
  • 获取日期中的周数:CodeIgniter 教程

    本教程旨在帮助开发者在 CodeIgniter 框架中,从日期字符串中准确提取周数。我们将使用 PHP 内置的 DateTime 类,并提供详细的代码示例和注意事项,确保您能够轻松地在项目中实现此功能。 使用 DateTime 类获取周数 PHP 的 DateTime 类提供了一种便捷的方式来处理日…

    2026年5月10日
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 《魔兽世界》将于6月11日开启国服回归技术测试

    《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试

    《%ign%ignore_a_1%re_a_1%》官方宣布,将于6月11日开启国服回归技术测试,时间为7天,并称可以在6月内正式开服,玩家们可以访问官网下载战网客户端并预下载“巫妖王之怒”客户端,技术测试详情见下图。 WordAi WordAI是一个AI驱动的内容重写平台 53 查看详情 以上就是《…

    2026年5月10日 用户投稿
    200
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    100
  • 创建指定大小并填充特定数据的Golang文件教程

    本文将介绍如何使用Golang创建一个指定大小的文件,并用特定数据填充它。我们将使用 `os` 包提供的函数来创建和截断文件,从而实现快速生成大文件的目的。示例代码展示了如何创建一个10MB的文件,并将其填充为全零数据。掌握这些方法,可以方便地在例如日志系统或磁盘队列等场景中,预先创建测试文件或初始…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 使用 WebCodecs VideoDecoder 实现精确逐帧回退

    本文档旨在解决在使用 WebCodecs VideoDecoder 进行视频解码时,实现精确逐帧回退的问题。通过比较帧的时间戳与目标帧的时间戳,可以避免渲染中间帧,从而提高用户体验。本文将提供详细的解决方案和示例代码,帮助开发者实现精确的视频帧控制。 在使用 WebCodecs VideoDecod…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • Debian Copilot的社区活跃度如何

    debian copilot是codeberg社区维护的ai助手,旨在为debian用户提供服务。尽管搜索结果中没有直接提供关于debian copilot社区支持活跃度的具体数据,但我们可以通过debian社区的整体活跃度和特点来推断其活跃性。 Debian社区的一般情况: Debian拥有详尽的…

    2026年5月10日
    000
  • Python递归函数追踪与性能考量:以序列打印为例

    本文深入探讨了Python中一种递归打印序列元素的方法,并着重演示了如何通过引入缩进参数来有效追踪递归函数的执行流程和参数变化。通过实际代码示例,文章揭示了递归调用可能带来的潜在性能开销,特别是对调用栈空间的需求,以及Python默认递归深度限制可能导致的错误,为读者提供了理解和优化递归算法的实用见…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信