深度学习--------------序列模型

目录

  • 序列数据
  • 统计工具
    • (方案一)马尔可夫假设
    • (方案二)潜变量模型
    • 总结
  • 序列模型
    • 基于马尔可夫假设方式
      • 该部分总代码
    • 单步预测
    • 多步预测
    • k步预测
      • 该部分总代码

序列数据

实际中数据是有时序结构的。



统计工具

在时间t观察带 x t x_t xt,(假设有T个时间的话)那么得到T个不独立的随机变量。( x 1 x_1 x1,… x T x_T xT)~ p(x)

使用条件概率展开
在这里插入图片描述

在这里插入图片描述
先算p( x 1 x_1 x1),然后 x 2 x_2 x2是依赖于 x 1 x_1 x1的, x 2 x_2 x2出现的概率是需要知道 x 1 x_1 x1是多少的。依次类推 x 3 x_3 x3依赖于 x 1 x_1 x1 x 2 x_2 x2。…

对条件概率建模(正向)
在这里插入图片描述
训练f的话,其实就是训练一个模型,用 x t − 1 x_{t-1} xt1个数据训练一个模型来预测下一个模型。

所谓的自回归:就是给出一些数据,然后去预测这个数据的时候,不是用的另一些数据而是用这个数据前面的一些样本,所以叫自回归





(方案一)马尔可夫假设

在这里插入图片描述
例:
在这里插入图片描述
在原始的模型中,这个数据点与前面三个相关

在这里插入图片描述

当τ=2的时候:

在这里插入图片描述
这个数据点与前τ个相关,即该数据点前2个。

在这里插入图片描述




(方案二)潜变量模型

在这里插入图片描述
在这里插入图片描述

例:算x1的话,就是跟前面的x相关,也与潜变量h1相关

一旦引入了潜变量概念的话,那么可以不断更新h。h1是根据前一个时间的潜变量和前一个时间的x相关。
等价于是说:建立两个模型。

第一个模型:根据前面一个事件的h和前面时间的x来算新的潜变量。

第二个模型:给定新的潜变量的状态和前一个时间的x怎么算新的x(这里指x1)。
在这里插入图片描述





反过来写:

在这里插入图片描述




总结

  ①时序模型中,当前数据跟之前观察到的数据相关

  ②自回归模型使用自身过去数据来预测未来

  ③马尔可夫模型假设当前只跟最近少数数据相关,从而简化模型。

  ④潜变量模型使用潜变量来概括历史信息。




序列模型

使用正弦函数和一些可加性噪声来生成序列数据,时间步为1,2,3…1000

import torch
from d2l import torch as d2lT = 1000  # 总共产生1000个点
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))
d2l.plot(time, [x], 'time', 'x', xlim=[1, 1000], figsize=(6, 3))
d2l.plt.tight_layout()
d2l.plt.show()

在这里插入图片描述
任务:给定任意一个时间点,预测接下来的时间的点长什么样子?



基于马尔可夫假设方式

使用马尔可夫假设:将数据映射为数据对在这里插入图片描述

y t y_t yt就表示预测第T个事件的数据。

解释:
①T - tau 为样本数,tau 为特征数,创建的是一个二维张量。

②表示有T-tau个元素(996),每个元素是一个长度为tau(即:向量中元素的数量为4)的向量,形状是[996,4]。

③这个矩阵的每一行将存储一个特征向量,每个特征向量包含tau个连续的时间点数据(即:每个特征向量的长度为4)。

④每个特征向量包含tau个连续的时间点数据。由于每个特征向量需要包含x中的前tau个时间点,所以最多只能构造出T - tau个这样的特征向量。

features = torch.zeros((T - tau, tau))

解释为什么这么设置:用一个例子举例推断说明

x = [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9]

在这里插入图片描述




# 延迟时间步长
tau = 4
# 1000个点中最多构造出996个特征向量,且特征向量的长度为4
# 一个特征向量就是一个样本
features = torch.zeros((T - tau, tau))# 每四个数据作为特征,第五个作为标签,不断构造这样的数据形成数据集
for i in range(tau):# x[i:T - tau + i]是切片操作,确保了每次都能从x中取出长度为tau的连续片段。# 当i=0时,x[0:996]右边不包含# 当i=1时,x[1:997]# 当i=2时,x[2:998]# 当i=3时,x[3:999]# features[:, i]是996行,4列,然而x是一个向量,且长度是996# 0   1   2   3# 1   2   3   4# 2   3   4   5# ...# 995 996 997 998features[:, i] = x[i:T - tau + i]# 提取标签数据并进行形状变换,从1行996列变成了996行1列 (即:从一维变成二维)
# x[tau:]从第五列开始到最后一列,转变为1列996行
labels = x[tau:].reshape((-1, 1))# # 批量大小和训练样本数量
batch_size, n_train = 16, 600
# 使用 features 和 labels 的前 n_train 个样本创建一个可迭代的训练集
# 第一个参数(features[:n_train], labels[:n_train])是一个元组
# 这行代码的作用是从完整的数据集(features和labels)中分割出训练集(前n_train个样本)
train_iter = d2l.load_array((features[:n_train], labels[:n_train]), batch_size, is_train=True)

为什么写这句代码?

    features[:, i] = x[i:T - tau + i]

在循环中的形状数据是这样的。(是不是很迷?这到底是在干什么?这里就是巧妙之处。)
在这里插入图片描述

这句代码设置的原因:
这是将i=0、1、2、3时,对应的1维的x的向量,填入features矩阵的第一列、第二列、第三列、第四列。
在这里插入图片描述
这里四个数据,也就是每一行作为数据特征。

在这里插入图片描述
第五个作为标签,第五个与前四个数据相关。

labels = x[tau:].reshape((-1, 1))



使用一个相当简单的结构:只是一个拥有两个全连接层的多层感知机。

# 初始化网络权重的函数
def init_weights(m):if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)# 一个简单的多层感知机
def get_net():net = nn.Sequential(nn.Linear(4, 10),nn.ReLU(),nn.Linear(10, 1))net.apply(init_weights)return net# 平方损失。注意:MSELoss计算平方误差时不带系数1/2
loss = nn.MSELoss(reduction='none')



训练模型

def train(net, train_iter, loss, epochs, lr):# 定义优化器trainer = torch.optim.Adam(net.parameters(), lr)# 迭代训练指定的轮数for epoch in range(epochs):# 遍历训练集中的每个批次for X, y in train_iter:# 梯度清零trainer.zero_grad()# 前向传播计算损失l = loss(net(X), y)# 反向传播求梯度l.backward()# 更新模型参数trainer.step()# 打印当前轮次的损失print(f'epoch {epoch + 1}, 'f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')# 创建神经网络模型
net = get_net()
# 训练模型
train(net, train_iter, loss, 5, 0.01)



该部分总代码

import torch
from torch import nn
from d2l import torch as d2ldef init_weights(m):if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)def get_net():net = nn.Sequential(nn.Linear(4, 10),nn.ReLU(),nn.Linear(10, 1))net.apply(init_weights)return netdef train(net, train_iter, loss, epochs, lr):# 定义优化器trainer = torch.optim.Adam(net.parameters(), lr)# 迭代训练指定的轮数for epoch in range(epochs):# 遍历训练集中的每个批次for X, y in train_iter:# 梯度清零trainer.zero_grad()# 前向传播计算损失l = loss(net(X), y)# 反向传播求梯度l.backward()# 更新模型参数trainer.step()# 打印当前轮次的损失print(f'epoch {epoch + 1}, 'f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')T = 1000
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):features[:, i] = x[i:T - tau + i]
labels = x[tau:].reshape((-1, 1))
batch_size, n_train = 16, 600
train_iter = d2l.load_array((features[:n_train], labels[:n_train]), batch_size, is_train=True)loss = nn.MSELoss()
# 创建神经网络模型
net = get_net()
# 训练模型
train(net, train_iter, loss, 5, 0.01)

在这里插入图片描述



单步预测

模型预测下一个时间步的能力(即:单步预测)

import torch
from torch import nn
from d2l import torch as d2ldef init_weights(m):if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)def get_net():net = nn.Sequential(nn.Linear(4, 10),nn.ReLU(),nn.Linear(10, 1))net.apply(init_weights)return net# net(要训练的神经网络模型)、train_iter(训练数据的迭代器,用于批量地提供训练数据)、loss(损失函数,用于评估模型的预测与实际值之间的差异)
def train(net, train_iter, loss, epochs, lr):# 定义优化器,目标是调整模型的参数,以最小化损失函数。Adam是一种基于梯度下降的优化算法,具有自适应学习率的特点。trainer = torch.optim.Adam(net.parameters(), lr)# 迭代训练指定的轮数for epoch in range(epochs):# 遍历训练集中的每个批次# 下面的y相当于合并元组中的labels[:n_train]for X, y in train_iter:# 梯度清零,PyTorch 会累积梯度,而我们需要的是每个批次独立计算的梯度trainer.zero_grad()# 通过模型 net 进行前向传播,计算模型对于当前批次数据的预测,然后使用损失函数 loss 计算预测值与真实值之间的损失。l = loss(net(X), y)# 反向传播求梯度l.backward()# 更新模型参数trainer.step()# 打印当前轮次的损失print(f'epoch {epoch + 1}, 'f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')T = 1000
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):features[:, i] = x[i:T - tau + i]
labels = x[tau:].reshape((-1, 1))
batch_size, n_train = 16, 600
# features[:n_train] 并不是取一维的,而是取 features 张量的前 n_train(这里是 600)行。
# 表示从整个特征集中选择了前 600 个特征向量作为训练集。
# 合并成一个元组是为了将数据分为特征和标签,并将它们作为训练数据集传递给数据加载器
train_iter = d2l.load_array((features[:n_train], labels[:n_train]), batch_size, is_train=True)# 只是定义还没使用
loss = nn.MSELoss()
# 创建神经网络模型
net = get_net()
# 训练模型,使用 features 和 labels 的前 n_train(即:600) 个样本进行训练。总共996个特征向量(features)
train(net, train_iter, loss, 5, 0.01)# 将特征数据输入到模型net中,并获取模型的一步预测结果onestep_preds。net是一个已经训练好的神经网络,用于根据给定的特征预测未来的某个值。
# 使用训练好的模型,对所有特征向量进行一个预测
# onestep_preds形状为(T - tau, 1),对应于features中每个特征向量的预测结果。每个预测值都是基于其对应的特征向量通过整个模型的前向传播过程计算得到的。
onestep_preds = net(features)# 进行数据可视化,将真实数据和一步预测结果绘制在同一个图中进行比较
d2l.plot(# 是两个x轴的数据系列,下面x.detach().numpy() 表示模型在原始时间轴 time 上的观测数据# onestep_preds.detach().numpy() 表示的是模型的预测数据。[time, time[tau:]],# x是在时间序列中真实观测到的数据。detach()用于从计算图中分离变量,防止其梯度被追踪# 将模型预测的一步结果从PyTorch张量转换为NumPy数组,以便绘图。[x.detach().numpy(), onestep_preds.detach().numpy()], 'time', 'x',legend=['data', 'l-step preds'], xlim=[1, 1000], figsize=(6, 3))
d2l.plt.show()

前向传播:

当net(features)被调用时,features中的每个特征向量(即每一行)都将被逐一传递给模型的第一个线性层。线性层会这些特征向量进行线性变换(即矩阵乘法加上偏置),产生新的特征表示。然后,这些新的特征表示会经过ReLU激活函数,进行非线性变换。最后,它们被传递给第二个线性层,该层将输出最终的预测结果。由于第二个线性层的输出维度为1,因此每个特征向量都会得到一个单一的预测值。
在这里插入图片描述

正如我们所料,单步预测效果不错。 即使这些预测的时间步超过了600+4(n_train + tau), 其结果看起来仍然是可信的。 然而有一个小问题:如果数据观察序列的时间步只到604, 我们需要一步一步地向前迈进:
在这里插入图片描述



多步预测

tau是每个特征向量包含的数量
为了进行多步预测,我们需要从当前点回溯 tau 个点来获取输入特征。

初始化多步预测:
开始多步预测时,您希望从训练数据的最后一个时间点之后立即开始,最后一个特征向量的最后一个时间点实际上与下一个时间点(即第一个未用于训练的时间点)是连续的,因此您只需要额外考虑 tau - 1 个时间点来确保时间窗口的连续性。然而,由于我们实际上想要包括训练数据中的最后一个完整特征向量,所以我们需要包括这个特征向量的所有 tau 个时间点。



    通常,对于直到 x t x_t xt的观测序列,其在时间步t+k处的预测输出在这里插入图片描述称为k步预测(k-step-ahead-prediction)。由于我们的观察已经到了 x 604 x_{604} x604,它的k步预测是在这里插入图片描述。换句话说,我们必须使用我们自己的预测(而不是原始数据)来进行多步预测。让我们看看效果如何。

import torch
from torch import nn
from d2l import torch as d2ldef init_weights(m):if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)def get_net():net = nn.Sequential(nn.Linear(4, 10),nn.ReLU(),nn.Linear(10, 1))net.apply(init_weights)return net# net(要训练的神经网络模型)、train_iter(训练数据的迭代器,用于批量地提供训练数据)、loss(损失函数,用于评估模型的预测与实际值之间的差异)
def train(net, train_iter, loss, epochs, lr):# 定义优化器,目标是调整模型的参数,以最小化损失函数。Adam是一种基于梯度下降的优化算法,具有自适应学习率的特点。trainer = torch.optim.Adam(net.parameters(), lr)# 迭代训练指定的轮数for epoch in range(epochs):# 遍历训练集中的每个批次# 下面的y相当于合并元组中的labels[:n_train]for X, y in train_iter:# 梯度清零,PyTorch 会累积梯度,而我们需要的是每个批次独立计算的梯度trainer.zero_grad()# 通过模型 net 进行前向传播,计算模型对于当前批次数据的预测,然后使用损失函数 loss 计算预测值与真实值之间的损失。l = loss(net(X), y)# 反向传播求梯度l.backward()# 更新模型参数trainer.step()# 打印当前轮次的损失print(f'epoch {epoch + 1}, 'f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')T = 1000
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):features[:, i] = x[i:T - tau + i]
labels = x[tau:].reshape((-1, 1))
batch_size, n_train = 16, 600
# features[:n_train] 并不是取一维的,而是取 features 张量的前 n_train(这里是 600)行。
# 表示从整个特征集中选择了前 600 个特征向量作为训练集。
# 合并成一个元组是为了将数据分为特征和标签,并将它们作为训练数据集传递给数据加载器
train_iter = d2l.load_array((features[:n_train], labels[:n_train]), batch_size, is_train=True)# 只是定义还没使用
loss = nn.MSELoss()
# 创建神经网络模型
net = get_net()
# 训练模型,使用 features 和 labels 的前 n_train(即:600) 个样本进行训练。总共996个特征向量(features)
train(net, train_iter, loss, 5, 0.01)# 将特征数据输入到模型net中,并获取模型的一步预测结果onestep_preds。net是一个已经训练好的神经网络,用于根据给定的特征预测未来的某个值。
# 使用训练好的模型,对所有特征向量进行一个预测
# onestep_preds形状为(T - tau, 1),对应于features中每个特征向量的预测结果。每个预测值都是基于其对应的特征向量通过整个模型的前向传播过程计算得到的。
onestep_preds = net(features)# 初始化多步预测结果的张量
multistep_preds = torch.zeros(T)
# 将已知的真实数据赋值给多步预测结果,0到604(604不包含)
# x[:n_train + tau]为已经拥有的真实的历史数据,可以直接使用这些数据作为多步预测的起点。
# 实际上是在告诉模型:“对于前 n_train + tau 个时间点,我们已经知道了真实的值,因此不需要预测它们。”
# 为什么是n_train + tau个呢?额外包含了 tau 个时间点确保在多步预测开始时有一个完整的时间窗口可用
multistep_preds[:n_train + tau] = x[:n_train + tau]# 对剩余时间步进行多步预测
for i in range(n_train + tau, T):# 获得多步预测结果# multistep_preds[i - tau:i]是从n_train到n_train+3四个,然后n_train+1,...n_train+tau+1四个,依次类推multistep_preds[i] = net(multistep_preds[i - tau:i].reshape((1, -1)))# 进行数据可视化
d2l.plot([time, time[tau:], time[n_train + tau:]],[x.detach().numpy(), onestep_preds.detach().numpy(), multistep_preds[n_train + tau:].detach().numpy()],'time','x',legend=['data', '1-step preds', 'multistep preds'],xlim=[1, 1000],figsize=(6, 3))d2l.plt.show()

前600个数据点做训练,后面600-1000做预测
所以从这个600开始就往后预测400个点,也就是那个绿色,发现相差很离谱。

绿色的上面的紫红色线是每一次去预测下一个点,然后在下一个数据点用真正观测到的数据给你。而绿色则是从600这里,蓝色的点就不在给出了,然后需要用自己的预测的值去预测,然后一直下去。
所以为什么会相差这么多呢?因为每一次预测的时候都有一点误差,然后误差不断叠加。就是说预测有误差,然后误差进入到数据,然后误差又会增加,然后就会不断累积误差。

在这里插入图片描述
如上面的例子所示,绿线的预测显然并不理想。 经过几个预测步骤之后,预测的结果很快就会衰减到一个常数。为什么这个算法效果这么差呢?事实是由于错误的累积:假设在步骤1之后,我们积累了一些错误在这里插入图片描述。 于是,步骤2的输入被扰动了在这里插入图片描述,结果积累的误差是依照次序的在这里插入图片描述,其中 c 为某个常数,后面的预测误差依此类推。因此误差可能会相当快地偏离真实的观测结果。

例如,未来24小时的天气预报往往相当准确,但超过这一点,精度就会迅速下降。




k步预测

基于k = 1, 4, 16, 64,通过对整个序列预测的计算,让我们更仔细地看一下k步预测的困难。

# 最大步长
max_steps = 64
# 初始化特征张量
features = torch.zeros((T - tau - max_steps + 1, tau + max_steps))
# 从 0 到 tau-1进行遍历
for i in range(tau):# 构造特征矩阵features[:, i] = x[i:i + T - tau - max_steps + 1]# 从 tau 到 tau + max_steps - 1,通过 net(features[:, i - tau:i]) 进行多步预测
for i in range(tau, tau + max_steps):# 进行多步预测并更新特征矩阵features[:,i] = net(features[:, i - tau:i]).reshape(-1)# 预测的步长
steps = (1, 4, 16, 64)
# 进行数据可视化
d2l.plot([time[tau + i - 1:T - max_steps + i] for i in steps],[features[:, (tau + i - 1)].detach().numpy() for i in steps],'time','x',legend = [f'{i}-step preds' for i in steps],xlim = [5,1000],figsize=(6,3) )



该部分总代码

import torch
from torch import nn
from d2l import torch as d2ldef init_weights(m):if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)def get_net():net = nn.Sequential(nn.Linear(4, 10),nn.ReLU(),nn.Linear(10, 1))net.apply(init_weights)return net# net(要训练的神经网络模型)、train_iter(训练数据的迭代器,用于批量地提供训练数据)、loss(损失函数,用于评估模型的预测与实际值之间的差异)
def train(net, train_iter, loss, epochs, lr):# 定义优化器,目标是调整模型的参数,以最小化损失函数。Adam是一种基于梯度下降的优化算法,具有自适应学习率的特点。trainer = torch.optim.Adam(net.parameters(), lr)# 迭代训练指定的轮数for epoch in range(epochs):# 遍历训练集中的每个批次# 下面的y相当于合并元组中的labels[:n_train]for X, y in train_iter:# 梯度清零,PyTorch 会累积梯度,而我们需要的是每个批次独立计算的梯度trainer.zero_grad()# 通过模型 net 进行前向传播,计算模型对于当前批次数据的预测,然后使用损失函数 loss 计算预测值与真实值之间的损失。l = loss(net(X), y)# 反向传播求梯度l.backward()# 更新模型参数trainer.step()# 打印当前轮次的损失print(f'epoch {epoch + 1}, 'f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')T = 1000
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):features[:, i] = x[i:T - tau + i]
labels = x[tau:].reshape((-1, 1))
batch_size, n_train = 16, 600
# features[:n_train] 并不是取一维的,而是取 features 张量的前 n_train(这里是 600)行。
# 表示从整个特征集中选择了前 600 个特征向量作为训练集。
# 合并成一个元组是为了将数据分为特征和标签,并将它们作为训练数据集传递给数据加载器
train_iter = d2l.load_array((features[:n_train], labels[:n_train]), batch_size, is_train=True)
# 只是定义还没使用
loss = nn.MSELoss()
# 创建神经网络模型
net = get_net()
# 训练模型,使用 features 和 labels 的前 n_train(即:600) 个样本进行训练。总共996个特征向量(features)
train(net, train_iter, loss, 5, 0.01)max_steps = 64
# 933行68列
features = torch.zeros((T - tau - max_steps + 1, tau + max_steps))# 列i(i<tau)是来自x的观测,其时间步从(i)到(i+T-tau-max_steps+1)
for i in range(tau):# 填充features矩阵的前tau列# i的取值0、1、2、3# 所有行的前四列,使用原始时间序列x的前tau个时间步的数据复制到features矩阵的前tau列中。# 0到933、1到934、2到935、3到936,x是一维的# 0   1   2   3# 1   2   3   4# 2   3   4   5# ...# 933 934 935 936# 每列代表一个时间步的观测数据,时间范围从i到i + T - tau - max_steps + 1。features[:, i] = x[i: i + T - tau - max_steps + 1]# 列i(i>=tau)是来自(i-tau+1)步的预测,其时间步从(i)到(i+T-tau-max_steps+1)
# 从4开始(第五个点)到67列
for i in range(tau, tau + max_steps):# 所有行的4到68列,features的所有行,0到4列#                               1到5列#                               2到6列#                                ...#                               63列到67列# 对于每一列(从tau(4列)到tau + max_steps - 1(67列)),它使用前tau(4)个时间步的观测数据(即features[:, i - tau:i])作为输入,# 通过前tau(4)个时间步(即观测数据)来预测第i个时间步的值。# 例如前4列预测第5列# 通过.reshape(-1)调整为与输入数据相同的形状,并存储在features矩阵的相应列中。features[:, i] = net(features[:, i - tau:i]).reshape(-1)
steps = (1, 4, 16, 64)# steps=1时,time从4到937(937不包含)
# steps=4时,time从7到940(940不包含)
# steps=16时,time从19到952(952不包含)
# steps=64时,time从67到1000(1000不包含)
d2l.plot([time[tau + i - 1: T - max_steps + i] for i in steps],# 从features矩阵中提取了每个预测步长对应的预测结果列# 所有行的4(标号)列,所有行的7(标号)列,所有行的19(标号)列,所有行的67(标号)列[features[:, tau + i - 1].detach().numpy() for i in steps],'time', 'x',legend=[f'{i}-step preds' for i in steps], xlim=[5, 1000],figsize=(6, 3))
d2l.plt.show()

蓝色点:
每次给出4个真实的数据点预测下一个

紫红色:
每次给出4个真实的数据点预测接下来4个(这4个不会给出真实数据)

绿色:
每次给出4个真实的数据点预测接下来16个(这16个不会给出真实数据)

红色:
每次给出4个真实的数据点预测接下来64个(这64个不会给出真实数据)
在这里插入图片描述

其中:

[time[tau + i - 1: T - max_steps + i] for i in steps]

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

git push : RPC failed; HTTP 400 curl 22 The requested URL returned error: 400

git push 出现RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 问题 git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 8 threads Compressing objects: 100% (10/10), done. error: RPC …

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中&#xff0c;有小伙伴指出&#xff0c;API服务存在线程安全问题&#xff1a; https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下&#xff0c;线程是否安全&#xff1f;如不安全&#xff0c;如何…

【AIGC】CFG:基于扩散模型分类器差异引导

摘要 分类器指导是最近引入的一种方法&#xff0c;在训练后在条件扩散模型中权衡模式覆盖率和样本保真度&#xff0c;在精神上与其他类型的生成模型中的低温采样或截断相同。分类器引导将扩散模型的分数估计与图像分类器的梯度相结合&#xff0c;因此需要训练与扩散模型分离的…

C#语言依然是主流的编程语言之一,不容置疑

C#语言是由微软在2000年发布的现代面向对象编程语言。尽管在编程语言市场中的占有率相对较低&#xff0c;但C#依然保持了强大的存在感&#xff0c;并未像一些其他语言那样逐渐被淘汰。C#语言不仅有其存在的独特理由&#xff0c;而且拥有许多令人无法忽视的优势。以下从多个方面…

积分电路和滤波电路的主要区别点和应用场合

文章目录 前言一、滤波电路的分类二、有源滤波器和无源滤波器的优缺点和实用范围三、积分电路3.1 无源积分电路3.2 RC充放电的电路响应3.2.1 RC电路的零状态响应3.2.2 RC电路的零输入响应3.2.3 RC电路的全响应3.2.4 选取合适的时间常数四 、无源RC低通滤波器4.3.1 截止频率推导…

kubernetes技术详解,带你深入了解k8s

目录 一、Kubernetes简介 1.1 容器编排应用 1.2 Kubernetes简介 1.3 k8s的设计架构 1.3.1 k8s各个组件的用途 1.3.2 k8s各组件之间的调用关系 1.3.3 k8s的常用名词概念 1.3.4 k8s的分层结构 二、k8s集群环境搭建 2.1 k8s中容器的管理方式 2.2 k8s环境部署 2.2.1 禁用…

VuePress搭建文档网站/个人博客(详细配置)主题配置-导航栏配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

针对国内AIGC市场,国内目前出台了那些法律法规?

针对国内AIGC市场&#xff0c;特别是AI生成与合成内容方面&#xff0c;中国已经出台了一系列法律法规来规范其发展和应用。 图片源自“央视新闻” 以下是一些主要的法律法规&#xff1a; 一、国家层面的法律法规 《中华人民共和国网络安全法》 施行时间&#xff1a;2017年6月…

进程监控与管理详解

一、进程的定义: 进程process是正在运行的程序,包括: 分配的内存地址空间 安全属性、包括所有权和特权 一个或多个线程 进程状态 进程的环境包括: 本地和全局变量 当前调度上下文…

java多线程编程示例

程序功能 程序展示了 Java 中如何使用多线程来并行执行任务。具体功能如下&#xff1a; 程序创建了三个线程&#xff0c;每个线程执行相同的任务类 Task。 每个线程在运行时输出自身名称&#xff0c;并模拟执行五次任务&#xff0c;每次任务间隔 1 秒。 主线程在启动这三个线程…

专业学习|系统动力学概观(方法特色、构成要素、建模步骤)

一、系统动力学概览 &#xff08;一&#xff09;系统动力学介绍 系统动力学是一门综合交叉学科&#xff0c;其基础理论涵盖了控制论、信息论和决策论等多个领域。它利用计算机仿真技术对复杂系统进行定量研究&#xff0c;尤其是那些具有非线性、高阶次和多重反馈特征的系统。这…

【可视化大屏系列】数据列表自动滚动效果

要实现列表的自动滚动效果&#xff0c;这里提供两种解决方案&#xff1a; 1.vue插件 官方文档&#xff1a;链接: vue-seamless-scroll &#xff08;1&#xff09;安装依赖 npm install vue-seamless-scroll --save&#xff08;2&#xff09;全局注册&#xff08;main.js中&a…

Mysql调优之性能监控(一)

前言&#xff1a; 官网就是最好的老师&#xff1a;MySQL&#xff0c;里面各种语法跟参数跟性能调试工具 一、使用show profile查询剖析工具 -- 开启 SET profiling 1; -- 关闭 SET profiling 0; -- 显示查询的性能分析信息 show profiles; -- 显示具体查询id的执行步骤耗时 S…

linux文件系统权限详解

注:目录的执行权限代表是否可以进入。 一、文件权限控制对文件的访问: 可以针对文件所属用户、所属组和其他用户可以设置不同的权限 权限具有优先级。user权限覆盖group权限,后者覆盖other权限。 有三种权限类别:读取、写入和执行 读权限:对文件:可读取文件…

Django_Vue3_ElementUI_Release_003_前端Vue3项目初始化

1. 概念扫盲 Node.js是基于ChromeV8引擎&#xff0c;让JS在服务端运行的开发平台&#xff0c;就是JS的一种解释器WebPack就是模块打包机&#xff0c;把浏览器不能直接运行的拓展语言找到并打包为合适的格式给浏览器直接使用Vue基于WebPack构件项目的&#xff0c;并带有合理默认…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议&#xff0c;是一个相当复杂的协议 TCP 详细展开讲解&#xff0c;是因为 TCP 确实在开发中非常关键&#xff0c;经常用到&#xff0c;IP 则不同&#xff0c;和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密&#xff08;开发路由器&#xff0…

2022高教社杯全国大学生数学建模竞赛C题 问题一(2) Python代码演示

目录 1.2 结合玻璃的类型,分析文物样品表面有无风化化学成分含量的统计规律数据预处理绘图热力图相关系数图百分比条形图箱线图小提琴图直方图KED图描述性统计分析偏度系数峰度系数其它统计量1.2 结合玻璃的类型,分析文物样品表面有无风化化学成分含量的统计规律 数据预处理 …

使用java程序生成具有3D效果的图片

程序功能 图像初始化&#xff1a;创建一个800x800像素的 BufferedImage 对象&#xff0c;并使用 Graphics2D 进行绘图操作。 光照效果&#xff1a;使用 RadialGradientPaint 实现径向渐变效果&#xff0c;模拟从图片中心向外扩散的光照&#xff0c;使图片有深度感&#xff0c;…

Maven 解析:打造高效、可靠的软件工程

Apache Maven【简称maven】 是一个用于 Java 项目的构建自动化工具&#xff0c; 通过提供一组规则来管理项目的构建、依赖关系和文档。 1.Pre-预备知识&#xff1a; 1.1.Maven是什么&#xff1f; [by Maven是什么&#xff1f;有什么作用&#xff1f;Maven的核心内容简述_ma…

【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623

1. 力扣1022&#xff1a;从根到叶的二进制之和 1.1 题目&#xff1a; 给出一棵二叉树&#xff0c;其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。 例如&#xff0c;如果路径为 0 -> 1 -> 1 -> 0 -> 1&#xff0c;那…