【Model】序列模型

序列模型的核心概念就是有n个有顺序因果关系的数据构成的模型,通常有两种策略实现:自回归模型(只需要满足某个长度为𝜏的时间跨度, 即使用观测序列𝑥𝑡−1,…,𝑥𝑡−𝜏。),以及隐变量自回归模型(由于ℎ𝑡从未被观测到)。

区别:

hidden variable:现实中存在,但我们未观察到的东西

latent variable:现实中可以不存在,但我们人为加上去,比如类别。。。

马尔可夫模型:就是假设一个数据的结果只与前𝜏个数据相关。

# 代码来自动手学深度学习 by 李沐
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l

T = 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))

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
# 只有前n_train个样本用于训练
train_iter = d2l.load_array((features[:n_train], labels[:n_train]),
                            batch_size, is_train=True)

# 初始化网络权重的函数
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.sum().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)

onestep_preds = net(features)
d2l.plot([time, time[tau:]],
         [x.detach().numpy(), onestep_preds.detach().numpy()], 'time',
         'x', legend=['data', '1-step preds'], xlim=[1, 1000],
         figsize=(6, 3))

multistep_preds = torch.zeros(T)
multistep_preds[: n_train + tau] = x[: n_train + tau]
for i in range(n_train + tau, T):
    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))

max_steps = 64

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[:, i] = x[i: i + T - tau - max_steps + 1]

# 列i(i>=tau)是来自(i-tau+1)步的预测,其时间步从(i)到(i+T-tau-max_steps+1)
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))

时间序列模型是用来分析和预测按时间顺序排列的数据序列的统计模型。在Python中,实现时间序列模型通常会使用到`statsmodels`或`scikit-learn`等库。下面是一个简单的例子,展示了如何使用`statsmodels`库来建立一个自回归(AR)时间序列模型: ```python import numpy as np import pandas as pd from statsmodels.tsa.ar_model import AutoReg from sklearn.metrics import mean_squared_error import matplotlib.pyplot as plt # 假设我们有一个时间序列数据集 data = np.array([1.1, 1.7, 2.8, 3.9, 3.7, 4.3, 5.2, 6.0, 6.8, 7.6]) # 将数据转换为Pandas Series series = pd.Series(data) # 为自回归模型准备滞后变量 # 假设我们使用前3期的数据来预测下一期,即p=3 lags = 3 X = series.shift(lags) X = X.dropna() # 删除因为滞后而产生的空值 y = series[lags:] # 目标是除去前面用于滞后变量的3个数据点 # 创建并拟合模型 model = AutoReg(X, lags=lags) fitted_model = model.fit() # 进行预测 predictions = fitted_model.predict(start=len(X), end=len(X) + len(y) - 1, dynamic=False) # 计算均方误差(MSE) mse = mean_squared_error(y, predictions) print(f"模型的均方误差为: {mse}") # 绘制预测结果和实际值 plt.figure(figsize=(10,6)) plt.plot(y.index, y, label='实际值') plt.plot(predictions.index, predictions, color='red', label='预测值') plt.title('时间序列预测结果') plt.legend() plt.show() ``` 在这个例子中,我们首先创建了一个简单的线性时间序列数据集,然后使用`AutoReg`类从`statsmodels`库来创建一个滞后3期的自回归模型模型被拟合后,我们对接下来的数据进行了预测,并计算了预测的均方误差。最后,我们使用matplotlib绘制了实际值和预测值以比较模型的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值