时间序列预测(二)——前馈神经网络(Feedforward Neural Network, FNN)

news2025/1/16 18:41:06

上一篇文章有提到线性回归方程。

时间序列预测(二)——前馈神经网络(Feedforward Neural Network, FNN)-CSDN博客

与线性回归相比:

线性回归只有一个线性层,输入直接映射到输出,不包含隐藏层和激活函数。而前馈神经网络通常包含多个隐藏层和非线性激活函数,可以学习更复杂的模式和非线性关系。当前馈神经网络只有一个输入层和一个输出层,且没有激活函数时,它实际上等价于线性回归。

接下来,讲前馈神经网络。

参考文章:

前馈神经网络(Feed-Forward Neural Network) - JackYang - 博客园 (cnblogs.com)

深度学习神经网络基础知识(三)前向传播,反向传播和计算图_前向传播公式-CSDN博客

优化器(Optimizer)(SGD、Momentum、AdaGrad、RMSProp、Adam) - CSDN

前馈神经网络(Feedforward Neural Networks)是最基础的神经网络类型,信号单向流动,从输入层到隐藏层再到输出层,没有反馈循环,它适用于非时间序列的预测问题。在时间序列预测中,前馈神经网络(FNN) 虽然没有时间依赖性,但可以通过适当的数据预处理来实现时间序列预测的功能。它的核心思路是将时间序列的历史数据转换为独立特征,然后通过 FNN 进行预测。这种方法称为 滞后输入法(Lagged Input Method)窗口法

一、基本结构和工作原理

1、基本结构

前馈神经网络(Feed-Forward Neural Network,简称FNN)是一种基本且广泛应用的人工神经网络结构。其结构由多个层次组成,主要包括:

  • 输入层:接收外部输入的数据,并将其传递给下一层。
  • 隐藏层:位于输入层和输出层之间,可以有一层或多层,负责对输入数据进行非线性变换和特征提取。
  • 输出层:接收隐藏层的输出,并将最终的结果输出

d6aae14cd98c49c2bbae44d572deaae6.png

2、工作原理

前馈神经网络的工作原理主要包括前向传播和反向传播两个过程。

(1)前向传播(Forward Propagation)

首先,输入数据首先进入输入层,然后依次经过每个隐藏层的神经元,每个神经元通过权重和偏置对输入进行线性组合,并经过激活函数处理。每层的输出成为下一层的输入。最后,隐藏层的最终输出通过输出层,生成预测结果。

如果是回归问题,输出可以是连续值;如果是分类问题,输出可以是概率分布或类别标签。

其中每个隐藏层的具体计算过程如下:

aef32e66b774409ea2609b8acc652fd1.png

涉及到激活函数后面介绍。

在前向传播中,网络的参数(权重和偏置)保持不变,网络对输入数据生成初始预测结果。

(2)反向传播(Backward Propagation)

反向传播是神经网络在训练过程中使用的,其实思路是和上一篇文章讲的线性回归一样的,也是如下两步:

a、先计算计算损失函数;

b、更新权重和偏置。从输出层开始,逐层计算误差的梯度,并沿着网络向输入层传播。每层的梯度用于更新更新各层的权重和偏置,使得模型的损失逐步减小。(即梯度下降,这只是优化器的一种,后面介绍)。

这里的损失函数要丰富一些,常见的损失函数包括均方误差(MSE)、交叉熵损失等,后面介绍。

总得来说,前向传播用来计算预测结果。反向传播用来计算误差并更新参数。这两个过程相互交替,逐步优化模型,使其对输入数据的预测越来越准确。

值得注意的是,这里的“反馈”仅用于权重的调整,并不构成循环反馈,即网络整体仍然是前馈的。网络接收新信息后,改变连接权值,调节最终输出,直至网络输出误差满足精度要求,结束训练。

二、补充的几个概念

1、激活函数(Activation Function)

激活函数是神经网络中每个神经元的输出函数,用于引入非线性,从而使神经网络能够逼近复杂的非线性关系。没有激活函数的网络只能表示线性变换(如上一篇的线性回归不需要激活函数),因此不能解决实际中的非线性问题。激活函数的输入是该神经元的加权和,输出则是处理后的值,通过激活函数的输出可以决定是否激活一个神经元,或者说一个神经元的输出程度。

具体请看下面这篇文章:

时间序列预测(三)——激活函数(Activation Function)-CSDN博客


2、损失函数(Loss Function)

损失函数是衡量模型预测值与真实值之间差异的函数,指导模型在训练过程中不断优化。根据任务类型和数据分布不同,常用的损失函数分为回归损失函数(如线性回归模型用到的)和分类损失函数两大类。

具体请看下面这篇文章:

3、优化器(Optimizer)

优化器用于更新神经网络的权重,以减少或最小化损失函数(loss function)的值以提高模型准确性,同时,优化器还能根据损失函数的梯度调整学习速率,帮助模型更好地学习,避免在训练过程中陷入局部最小值。常见的有BGD、SGD、Adam和RMSProp。

具体请看下面这篇文章:

三、前馈神经网络(FNN)与多层感知器(MLP)的关系

看其他文章又看到了多层感知器,说是和前馈神经网络很像,查了一下:

多层感知器是一种经典的前馈人工神经网络,是前馈人工神经网络的一个子集,通常专指由多个隐藏层组成的网络。所有的多层感知器都是前馈神经网络,但并非所有的前馈神经网络都是多层感知器。前馈神经网络可以包含更复杂的结构,如卷积层、池化层等,而多层感知器则主要由全连接层组成。

四、代码实现

同前一篇文章一样,根据一个包含道路曲率(Curvature)、车速(Velocity)、侧向加速度(Ay)和方向盘转角(Steering_Angle)真实的数据集,去预测未来的方向盘转角。

import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error as mae
import matplotlib.pyplot as plt

# 1. 数据预处理
# 读取数据  
data = pd.read_excel('input_data_20241010160240.xlsx')  # 替换为你的数据文件路径  

# 提取特征和标签  
labels = data['Steering_Angle'].values
features = data[['Curvature', 'Ay', 'Velocity']].values  # 使用 NumPy 数组

# 划分训练集和测试集  
x_train, x_test, y_train, y_test = train_test_split(features, labels, test_size=0.2)

# 转换为 PyTorch 张量
x_train_tensor = torch.tensor(x_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
x_test_tensor = torch.tensor(x_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

# 2. 创建神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(3, 64)  # 输入层到隐藏层
        self.fc2 = nn.Linear(64, 32)  # 隐藏层到隐藏层
        self.fc3 = nn.Linear(32, 1)   # 隐藏层到输出层
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))  # 激活函数
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 实例化模型
model = SimpleNN()

# 3. 设置损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam 优化器

# 4. 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    model.train()
    
    # 前向传播
    outputs = model(x_train_tensor)
    loss = criterion(outputs, y_train_tensor)

    # 后向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

# 5. 预测
model.eval()
with torch.no_grad():
    y_pred_tensor = model(x_test_tensor)

y_pred = y_pred_tensor.numpy()

# 评估指标
score = 1 - (mae(y_test, y_pred) / (y_test.mean() if y_test.mean() != 0 else 1))
print(f"R^2 score: {score}")

# 绘制实际值和预测值的对比图
plt.figure(figsize=(10, 6))
plt.plot(range(len(y_test)), y_test, label='实际值', color='blue')
plt.plot(range(len(y_pred)), y_pred, label='预测值', color='red')
plt.xlabel('样本索引')
plt.ylabel('Steering Angle')
plt.title('实际值与预测值对比图')
plt.legend()
plt.grid(True)
plt.show()

输出结果:03b37b4375014b8c9cebe5a06e273fac.png

3c63b0ec155645419af6942aaa7d4337.png

别忘了给这篇文章点个赞哦,非常感谢。我也正处于学习的过程,可能会有错,如果有问题,欢迎在评论区留言讨论,一起学习!

a89ae1f052204243ad7682a9c9d8732f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「漏洞复现」灵当CRM data/pdf.php 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

网页内容获取:Scala自动化脚本的实现

对于开发者和数据科学家来说,自动化获取网页内容是一个常见的需求。Scala,作为一种多范式编程语言,以其强大的函数式编程特性和并发处理能力,成为了编写高效自动化脚本的理想选择。本文将介绍如何使用Scala结合Selenium WebDriver…

Element Ui el-table列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示内容,虽然el-table列属性中带的有show-overflow-tooltip,可以设置内容超出列宽度显示为…,且有tooltip提示全部内容,但是内容过多时,提示会超出屏幕: 只有…

芒果YOLOv10改进136:注意力机制MLLA|即插即用:融合Mamba设计精髓的线性注意力视觉Transformer

💡本篇内容:芒果YOLOv10改进136:即插即用,最新注意力机制MLLA:融合 Mamba 设计精髓的线性注意力视觉Transformer MLLA|Mamba-Like Linear Attention 模块 | 即插即用 该模块将选择性的状态空间模型和线性注意力在一个统一公式中进行了重新阐述,将Mamba重新定义为具有六个主…

从头开始的可视化数据 matplotlib:初学者努力绘制数据图

从头开始学习使用 matplotlib 可视化数据,对于初学者来说,可能会有些挑战,但 matplotlib 的核心理念非常清晰:绘制图表需要了解如何设置图形、坐标轴以及如何用数据填充它们。我们可以通过一些简单的例子来逐步介绍基本步骤。 1. …

小程序底部导航按钮实现

商城小程序需要四个底部导航按钮,遂记录一下实现过程 最终实现效果如下所示 新建一个小程序项目,我是创建了JS模板,项目创建完成后需要新建五个文件夹,其中四个(page子文件夹)用于存放pages文件&#xff0…

探索光耦:光耦——不间断电源(UPS)系统中的安全高效卫士

在现代社会,不间断电源(UPS)系统已成为保障关键设备和数据安全的关键设施,广泛应用于企业数据中心、家庭电子设备等场景。UPS能在电力中断或波动时提供稳定电力,确保设备持续运行。而在这套系统中,光耦&…

C# 使用S7netplus读取西门子PLC的DB块-S7协议

在工业的设备监控领域,S7协议使用比较普遍下面简单教大家使用 1、添加包 2、添加帮助类(读写数据就研究该类即可,具体的理论就不多说了) //plc中类型与c#类型 bool > Bit //Byte > byte //word > ushort //DWord > uint //Int > short …

【AI知识点】三种不同架构的大语言模型(LLMs)的区别

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI大项目】【AI应用】 在自然语言处理(NLP)中,预训练语言模型(LLMs, Large Language Models)通常基于不同的架构,如仅编码器的模型(Enc…

Java开发中知识点整理

正则表达式 测试网址 Git 分支和主分支有冲突 先checkout origin/分支把origin/master pull进本地分支 修改冲突MergeCommit and Push

Apache SeaTunnel 介绍

SeaTunnel是一个非常易用、超高性能的分布式数据集成平台,支持实时海量数据同步。 每天可稳定高效同步数百亿数据,已被近百家企业应用于生产。 为什么需要 SeaTunnel​ SeaTunnel专注于数据集成和数据同步,主要旨在解决数据集成领域的常见问…

【OSCP Proving Grounds 靶场系列】Slort

作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

121页满分PPT | XX集团SAP ERP业务蓝图规划方案

这份PPT是德勤的集团SAP ERP业务蓝图规划方案的详细介绍,涵盖了项目背景、总体目标、ERP总体蓝图规划、总体规划路线设计以及风险与保障措施。方案强调了在煤炭市场疲软的宏观背景下,集团如何通过ERP系统实施来加强管控、提升业财管理一体化,…

VSCode esp-idf环境搭建 报错 ERROR_INVALID_PIP

例如我的报错提示 D:\APP\Espressif\idf531\Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERROR_INVALID_PIP)找到目录位置D:\APP\Espressif\idf531\Espressif\tools\idf-python\3.11.2 使用下面的指令更新pip python -m ensurepippython -m …

二叉搜索树(超详细+通俗易懂)

二叉搜索树定义: 二叉搜索树又被称为二叉排序树/二叉搜索树,为什么会被起这样的名字呢?我们先来看一张二叉搜索树的图片 这张图片里面的树就是二叉搜素树,那么二叉树有什么性质呢?我们从图中可以发现,每一个子树都是…

Flink05 Windows 操作轻松应对复杂的场景

Flink Windows 操作 上篇文章介绍了Flink 几种类型 Windows 本文介绍窗口操作相关API,以及各自使用场景 。 本期Flink Windows 相关操作apply/union/join/collect/CoMap/CoFlatMap Windows apply 通过实现WindowFunction或AllWindowFunction接口来完成的&#x…

工具篇:(三)MacOS 两种方式下载 Node.js 并进行测试教程

MacOS 两种方式下载 Node.js 并进行测试教程 1.Node.js 官网 下载 步骤 1: 访问 Node.js 官网 打开浏览器,访问 Node.js 的官方网站:https://nodejs.org。 在首页,你会看到两个版本可供下载: LTS(长期支持版本&…

从0到1封装一个image/pdf预览组件

目录结构 content.vue <template><div class"no-content-block"><i class"iconfont icondocument large-file" /><div class"text-wrapper">{{ t(__ui__.siPreview.previewSupported) }}</div><div class&quo…

【CSS in Depth 2 精译_049】7.2 CSS 响应式设计中的媒体查询原则(下):响应式列的添加

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

RabbitMQ 核心功能详解

引言 在现代分布式系统中&#xff0c;消息队列已经成为一种不可或缺的组件。它不仅能够实现应用之间的解耦&#xff0c;还能提高系统的灵活性和可扩展性。RabbitMQ 是一款基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议的消息中间件&#xff0c;以其…