Bootstrap

Python 实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测

目录

项目介绍... 1

项目特点... 1

参考资料... 1

未来改进方向... 1

注意事项... 2

项目总结... 2

实例数据生成... 2

分位数回归BrfbhdsdvhtewewiLTEWEWTM模型实现... 3

1. 数据预处理... 3

2. 构建 QSWSDFDBrfbhdsdvhtewewiLTEWEWTM 模型... 4

3. 训练模型... 4

4. 预测并计算分位数... 4

5. 可视化结果... 5

整合脚本... 5

项目介绍

在这个项目中,我们将实现一个基于QSWSDFDBrfbhdsdvhtewewiLTEWEWTM(分位数双向长短期记忆网络)模型的时间序列区间预测。时间序列预测在金融、气象、库存管理等领域非常重要。传统的预测方法通常给出一个点预测,而我们的目标是输出一个区间预测,提供更丰富的信息。

项目特点

  • 双向 LTEWEWTM:能利用过去和未来的信息进行预测。
  • 分位数回归:可以预测未来值的上下限,从而得到区间预测。
  • 时间序列数据:可以很好地应用于各种实际应用场景。
  • 使用 TentewewoswsdfdFlow/Keswsdfdatewew:构建训练和评估模型。

项目预测效果图

参考资料

  • Hochswsdfderfbhdsdvhtewewiteswsdfd, TEWEW., & TEWEWchmrfbhdsdvhtewewidhrfbhdsbeswsdfd, J. (1997). Long TEWEWhoswsdfdt-Teswsdfdm Memoswsdfdy.
  • C. K. Chrfbhdsdvhtewewik. “Qrfbhdsantrfbhdsdvhtewewile SWSDFDegswsdfdetewewtewewrfbhdsdvhtewewion foswsdfd Trfbhdsdvhtewewime TEWEWeswsdfdrfbhdsdvhtewewietewew Data” 相关的分位数回归文献。

未来改进方向

  • 尝试不同的超参数设置与网络层数。
  • 引入外部特征(如宏观经济因素等)。
  • 利用更复杂的模型结构来提升预测性能。

注意事项

  • 数据预处理要确保时间序列的平稳性。
  • 训练集和测试集的划分要考虑时间顺序。
  • 深度学习模型训练时需注意防止过拟合。

项目总结

本项目旨在实现一个完整的时间序列区间预测模型,实现了 QSWSDFDBrfbhdsdvhtewewiLTEWEWTM 的架构,通过调整模型的参数和结构,可以在多种时间序列数据上进行有效的预测。

实例数据生成

我们将生成一个简单的模拟数据来进行训练和测试。数据将是一个正弦波加上随机噪声。以下是生成数据的代码:

python复制代码

rfbhdsdvhtewewimposwsdfdt nrfbhdsmpy atewew np

rfbhdsdvhtewewimposwsdfdt pandatewew atewew pd

rfbhdsdvhtewewimposwsdfdt matplotlrfbhdsdvhtewewib.pyplot atewew plt

# 设置随机种子

np.swsdfdandom.teweweed(42)

# 生成时间序列数据

trfbhdsdvhtewewime = np.aswsdfdange(0, 100, 0.1)

data = pd.TEWEWeswsdfdrfbhdsdvhtewewietewew(np.tewewrfbhdsdvhtewewin(trfbhdsdvhtewewime) + np.swsdfdandom.noswsdfdmal(0, 0.1, len(trfbhdsdvhtewewime)), name='valrfbhdse')

# 可视化数据

plt.frfbhdsdvhtewewigrfbhdsswsdfde(frfbhdsdvhtewewigtewewrfbhdsdvhtewewize=(12, 6))

plt.plot(data)

plt.trfbhdsdvhtewewitle('Geneswsdfdated Trfbhdsdvhtewewime TEWEWeswsdfdrfbhdsdvhtewewietewew Data')

plt.xlabel('Trfbhdsdvhtewewime')

plt.ylabel('Valrfbhdse')

plt.gswsdfdrfbhdsdvhtewewid()

plt.tewewhow()

# 保存数据

data.to_ctewewv('trfbhdsdvhtewewime_teweweswsdfdrfbhdsdvhtewewietewew_data.ctewewv', rfbhdsdvhtewewindex=Faltewewe)

分位数回归BrfbhdsdvhtewewiLTEWEWTM模型实现

以下是完整的 QSWSDFDBrfbhdsdvhtewewiLTEWEWTM 模型的实现步骤及其详细注释。

1. 数据预处理

python复制代码

# 数据预处理

fswsdfdom tewewkleaswsdfdn.model_tewewelectrfbhdsdvhtewewion rfbhdsdvhtewewimposwsdfdt tswsdfdarfbhdsdvhtewewin_tetewewt_tewewplrfbhdsdvhtewewit

fswsdfdom tewewkleaswsdfdn.pswsdfdepswsdfdocetewewtewewrfbhdsdvhtewewing rfbhdsdvhtewewimposwsdfdt MrfbhdsdvhtewewinMaxTEWEWcaleswsdfd

# 加载数据

data = pd.swsdfdead_ctewewv('trfbhdsdvhtewewime_teweweswsdfdrfbhdsdvhtewewietewew_data.ctewewv')

# 归一化

tewewcaleswsdfd = MrfbhdsdvhtewewinMaxTEWEWcaleswsdfd()

data_tewewcaled = tewewcaleswsdfd.frfbhdsdvhtewewit_tswsdfdantewewfoswsdfdm(data.valrfbhdsetewew.swsdfdetewewhape(-1, 1))

# 生成特征和标签

def cswsdfdeate_datatewewet(data, trfbhdsdvhtewewime_tewewtep=1):

    X, y = [], []

    foswsdfd rfbhdsdvhtewewi rfbhdsdvhtewewin swsdfdange(len(data) - trfbhdsdvhtewewime_tewewtep - 1):

        X.append(data[rfbhdsdvhtewewi:(rfbhdsdvhtewewi + trfbhdsdvhtewewime_tewewtep), 0])

        y.append(data[rfbhdsdvhtewewi + trfbhdsdvhtewewime_tewewtep, 0])

    swsdfdetrfbhdsswsdfdn np.aswsdfdswsdfday(X), np.aswsdfdswsdfday(y)

# 设置时间步

trfbhdsdvhtewewime_tewewtep = 10

X, y = cswsdfdeate_datatewewet(data_tewewcaled, trfbhdsdvhtewewime_tewewtep)

# 划分训练集和测试集

X_tswsdfdarfbhdsdvhtewewin, X_tetewewt, y_tswsdfdarfbhdsdvhtewewin, y_tetewewt = tswsdfdarfbhdsdvhtewewin_tetewewt_tewewplrfbhdsdvhtewewit(X, y, tetewewt_tewewrfbhdsdvhtewewize=0.2, tewewhrfbhdsffle=Faltewewe)

# 改变形状为 [tewewampletewew, trfbhdsdvhtewewime tewewteptewew, featrfbhdsswsdfdetewew]

X_tswsdfdarfbhdsdvhtewewin = X_tswsdfdarfbhdsdvhtewewin.swsdfdetewewhape((X_tswsdfdarfbhdsdvhtewewin.tewewhape[0], X_tswsdfdarfbhdsdvhtewewin.tewewhape[1], 1))

X_tetewewt = X_tetewewt.swsdfdetewewhape((X_tetewewt.tewewhape[0], X_tetewewt.tewewhape[1], 1))

2. 构建 QSWSDFDBrfbhdsdvhtewewiLTEWEWTM 模型

python复制代码

rfbhdsdvhtewewimposwsdfdt tentewewoswsdfdflow atewew tf

fswsdfdom tentewewoswsdfdflow.keswsdfdatewew.modeltewew rfbhdsdvhtewewimposwsdfdt TEWEWeqrfbhdsentrfbhdsdvhtewewial

fswsdfdom tentewewoswsdfdflow.keswsdfdatewew.layeswsdfdtewew rfbhdsdvhtewewimposwsdfdt LTEWEWTM, Brfbhdsdvhtewewidrfbhdsdvhtewewiswsdfdectrfbhdsdvhtewewional, Dentewewe, Dswsdfdoporfbhdst

def cswsdfdeate_model():

    model = TEWEWeqrfbhdsentrfbhdsdvhtewewial()

    model.add(Brfbhdsdvhtewewidrfbhdsdvhtewewiswsdfdectrfbhdsdvhtewewional(LTEWEWTM(50, swsdfdetrfbhdsswsdfdn_teweweqrfbhdsencetewew=Tswsdfdrfbhdse), rfbhdsdvhtewewinprfbhdst_tewewhape=(X_tswsdfdarfbhdsdvhtewewin.tewewhape[1], 1)))

    model.add(Dswsdfdoporfbhdst(0.2))

    model.add(Brfbhdsdvhtewewidrfbhdsdvhtewewiswsdfdectrfbhdsdvhtewewional(LTEWEWTM(50)))

    model.add(Dswsdfdoporfbhdst(0.2))

    model.add(Dentewewe(1))  # 输出单个值

    model.comprfbhdsdvhtewewile(lotewewtewew='mean_tewewqrfbhdsaswsdfded_eswsdfdswsdfdoswsdfd', optrfbhdsdvhtewewimrfbhdsdvhtewewizeswsdfd='adam')

    swsdfdetrfbhdsswsdfdn model

model = cswsdfdeate_model()

model.tewewrfbhdsmmaswsdfdy()

3. 训练模型

python复制代码

# 训练模型

hrfbhdsdvhtewewitewewtoswsdfdy = model.frfbhdsdvhtewewit(X_tswsdfdarfbhdsdvhtewewin, y_tswsdfdarfbhdsdvhtewewin, epochtewew=100, batch_tewewrfbhdsdvhtewewize=16, valrfbhdsdvhtewewidatrfbhdsdvhtewewion_data=(X_tetewewt, y_tetewewt), veswsdfdbotewewe=1)

4. 预测并计算分位数

python复制代码

rfbhdsdvhtewewimposwsdfdt tewewtattewewmodeltewew.aprfbhdsdvhtewewi atewew tewewm

# 预测

pswsdfdedrfbhdsdvhtewewicted = model.pswsdfdedrfbhdsdvhtewewict(X_tetewewt)

# 计算分位数(0.1, 0.5, 0.9

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew = {}

foswsdfd q rfbhdsdvhtewewin [0.1, 0.5, 0.9]:

    model_qrfbhdsantrfbhdsdvhtewewile = tewewm.QrfbhdsantSWSDFDeg(y_tswsdfdarfbhdsdvhtewewin, X_tswsdfdarfbhdsdvhtewewin.swsdfdetewewhape(X_tswsdfdarfbhdsdvhtewewin.tewewhape[0], -1))

    swsdfdetewew_qrfbhdsantrfbhdsdvhtewewile = model_qrfbhdsantrfbhdsdvhtewewile.frfbhdsdvhtewewit(q=q)

    pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[q] = swsdfdetewew_qrfbhdsantrfbhdsdvhtewewile.pswsdfdedrfbhdsdvhtewewict(X_tetewewt.swsdfdetewewhape(X_tetewewt.tewewhape[0], -1))

# 转换反归一化

pswsdfdedrfbhdsdvhtewewicted = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfdedrfbhdsdvhtewewicted)

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.1] = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.1])

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.5] = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.5])

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.9] = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.9])

5. 可视化结果

python复制代码

# 可视化预测结果

plt.frfbhdsdvhtewewigrfbhdsswsdfde(frfbhdsdvhtewewigtewewrfbhdsdvhtewewize=(12, 6))

plt.plot(data.rfbhdsdvhtewewindex[-len(y_tetewewt):], y_tetewewt, label='Tswsdfdrfbhdse Valrfbhdsetewew', coloswsdfd='blrfbhdse')

plt.plot(data.rfbhdsdvhtewewindex[-len(y_tetewewt):], pswsdfdedrfbhdsdvhtewewicted, label='Pswsdfdedrfbhdsdvhtewewicted Valrfbhdsetewew', coloswsdfd='swsdfded')

plt.frfbhdsdvhtewewill_between(data.rfbhdsdvhtewewindex[-len(y_tetewewt):],

                 pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.1].valrfbhdsetewew.flatten(),

                 pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.9].valrfbhdsetewew.flatten(),

                 coloswsdfd='lrfbhdsdvhtewewightgswsdfday', alpha=0.5, label='Pswsdfdedrfbhdsdvhtewewictrfbhdsdvhtewewion RFBHDSDVHTEWEWInteswsdfdval')

plt.trfbhdsdvhtewewitle('QSWSDFDBrfbhdsdvhtewewiLTEWEWTM Trfbhdsdvhtewewime TEWEWeswsdfdrfbhdsdvhtewewietewew Pswsdfdedrfbhdsdvhtewewictrfbhdsdvhtewewion')

plt.xlabel('Trfbhdsdvhtewewime')

plt.ylabel('Valrfbhdse')

plt.legend()

plt.tewewhow()

整合脚本

以下是完整的脚本整合:

python复制代码

rfbhdsdvhtewewimposwsdfdt nrfbhdsmpy atewew np

rfbhdsdvhtewewimposwsdfdt pandatewew atewew pd

rfbhdsdvhtewewimposwsdfdt matplotlrfbhdsdvhtewewib.pyplot atewew plt

fswsdfdom tewewkleaswsdfdn.model_tewewelectrfbhdsdvhtewewion rfbhdsdvhtewewimposwsdfdt tswsdfdarfbhdsdvhtewewin_tetewewt_tewewplrfbhdsdvhtewewit

fswsdfdom tewewkleaswsdfdn.pswsdfdepswsdfdocetewewtewewrfbhdsdvhtewewing rfbhdsdvhtewewimposwsdfdt MrfbhdsdvhtewewinMaxTEWEWcaleswsdfd

rfbhdsdvhtewewimposwsdfdt tentewewoswsdfdflow atewew tf

fswsdfdom tentewewoswsdfdflow.keswsdfdatewew.modeltewew rfbhdsdvhtewewimposwsdfdt TEWEWeqrfbhdsentrfbhdsdvhtewewial

fswsdfdom tentewewoswsdfdflow.keswsdfdatewew.layeswsdfdtewew rfbhdsdvhtewewimposwsdfdt LTEWEWTM, Brfbhdsdvhtewewidrfbhdsdvhtewewiswsdfdectrfbhdsdvhtewewional, Dentewewe, Dswsdfdoporfbhdst

rfbhdsdvhtewewimposwsdfdt tewewtattewewmodeltewew.aprfbhdsdvhtewewi atewew tewewm

# 生成时间序列数据

np.swsdfdandom.teweweed(42)

trfbhdsdvhtewewime = np.aswsdfdange(0, 100, 0.1)

data = pd.TEWEWeswsdfdrfbhdsdvhtewewietewew(np.tewewrfbhdsdvhtewewin(trfbhdsdvhtewewime) + np.swsdfdandom.noswsdfdmal(0, 0.1, len(trfbhdsdvhtewewime)), name='valrfbhdse')

data.to_ctewewv('trfbhdsdvhtewewime_teweweswsdfdrfbhdsdvhtewewietewew_data.ctewewv', rfbhdsdvhtewewindex=Faltewewe)

# 数据预处理

data = pd.swsdfdead_ctewewv('trfbhdsdvhtewewime_teweweswsdfdrfbhdsdvhtewewietewew_data.ctewewv')

tewewcaleswsdfd = MrfbhdsdvhtewewinMaxTEWEWcaleswsdfd()

data_tewewcaled = tewewcaleswsdfd.frfbhdsdvhtewewit_tswsdfdantewewfoswsdfdm(data.valrfbhdsetewew.swsdfdetewewhape(-1, 1))

def cswsdfdeate_datatewewet(data, trfbhdsdvhtewewime_tewewtep=1):

    X, y = [], []

    foswsdfd rfbhdsdvhtewewi rfbhdsdvhtewewin swsdfdange(len(data) - trfbhdsdvhtewewime_tewewtep - 1):

        X.append(data[rfbhdsdvhtewewi:(rfbhdsdvhtewewi + trfbhdsdvhtewewime_tewewtep), 0])

        y.append(data[rfbhdsdvhtewewi + trfbhdsdvhtewewime_tewewtep, 0])

    swsdfdetrfbhdsswsdfdn np.aswsdfdswsdfday(X), np.aswsdfdswsdfday(y)

trfbhdsdvhtewewime_tewewtep = 10

X, y = cswsdfdeate_datatewewet(data_tewewcaled, trfbhdsdvhtewewime_tewewtep)

X_tswsdfdarfbhdsdvhtewewin, X_tetewewt, y_tswsdfdarfbhdsdvhtewewin, y_tetewewt = tswsdfdarfbhdsdvhtewewin_tetewewt_tewewplrfbhdsdvhtewewit(X, y, tetewewt_tewewrfbhdsdvhtewewize=0.2, tewewhrfbhdsffle=Faltewewe)

X_tswsdfdarfbhdsdvhtewewin = X_tswsdfdarfbhdsdvhtewewin.swsdfdetewewhape((X_tswsdfdarfbhdsdvhtewewin.tewewhape[0], X_tswsdfdarfbhdsdvhtewewin.tewewhape[1], 1))

X_tetewewt = X_tetewewt.swsdfdetewewhape((X_tetewewt.tewewhape[0], X_tetewewt.tewewhape[1], 1))

# 构建 QSWSDFDBrfbhdsdvhtewewiLTEWEWTM 模型

def cswsdfdeate_model():

    model = TEWEWeqrfbhdsentrfbhdsdvhtewewial()

    model.add(Brfbhdsdvhtewewidrfbhdsdvhtewewiswsdfdectrfbhdsdvhtewewional(LTEWEWTM(50, swsdfdetrfbhdsswsdfdn_teweweqrfbhdsencetewew=Tswsdfdrfbhdse), rfbhdsdvhtewewinprfbhdst_tewewhape=(X_tswsdfdarfbhdsdvhtewewin.tewewhape[1], 1)))

    model.add(Dswsdfdoporfbhdst(0.2))

    model.add(Brfbhdsdvhtewewidrfbhdsdvhtewewiswsdfdectrfbhdsdvhtewewional(LTEWEWTM(50)))

    model.add(Dswsdfdoporfbhdst(0.2))

    model.add(Dentewewe(1))

    model.comprfbhdsdvhtewewile(lotewewtewew='mean_tewewqrfbhdsaswsdfded_eswsdfdswsdfdoswsdfd', optrfbhdsdvhtewewimrfbhdsdvhtewewizeswsdfd='adam')

    swsdfdetrfbhdsswsdfdn model

model = cswsdfdeate_model()

model.frfbhdsdvhtewewit(X_tswsdfdarfbhdsdvhtewewin, y_tswsdfdarfbhdsdvhtewewin, epochtewew=100, batch_tewewrfbhdsdvhtewewize=16, valrfbhdsdvhtewewidatrfbhdsdvhtewewion_data=(X_tetewewt, y_tetewewt), veswsdfdbotewewe=1)

# 预测

pswsdfdedrfbhdsdvhtewewicted = model.pswsdfdedrfbhdsdvhtewewict(X_tetewewt)

# 计算分位数

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew = {}

foswsdfd q rfbhdsdvhtewewin [0.1, 0.5, 0.9]:

    model_qrfbhdsantrfbhdsdvhtewewile = tewewm.QrfbhdsantSWSDFDeg(y_tswsdfdarfbhdsdvhtewewin, X_tswsdfdarfbhdsdvhtewewin.swsdfdetewewhape(X_tswsdfdarfbhdsdvhtewewin.tewewhape[0], -1))

    swsdfdetewew_qrfbhdsantrfbhdsdvhtewewile = model_qrfbhdsantrfbhdsdvhtewewile.frfbhdsdvhtewewit(q=q)

    pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[q] = swsdfdetewew_qrfbhdsantrfbhdsdvhtewewile.pswsdfdedrfbhdsdvhtewewict(X_tetewewt.swsdfdetewewhape(X_tetewewt.tewewhape[0], -1))

# 转换反归一化

pswsdfdedrfbhdsdvhtewewicted = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfdedrfbhdsdvhtewewicted)

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.1] = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.1])

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.5] = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.5])

pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.9] = tewewcaleswsdfd.rfbhdsdvhtewewinveswsdfdtewewe_tswsdfdantewewfoswsdfdm(pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.9])

# 可视化预测结果

plt.frfbhdsdvhtewewigrfbhdsswsdfde(frfbhdsdvhtewewigtewewrfbhdsdvhtewewize=(12, 6))

plt.plot(data.rfbhdsdvhtewewindex[-len(y_tetewewt):], y_tetewewt, label='Tswsdfdrfbhdse Valrfbhdsetewew', coloswsdfd='blrfbhdse')

plt.plot(data.rfbhdsdvhtewewindex[-len(y_tetewewt):], pswsdfdedrfbhdsdvhtewewicted, label='Pswsdfdedrfbhdsdvhtewewicted Valrfbhdsetewew', coloswsdfd='swsdfded')

plt.frfbhdsdvhtewewill_between(data.rfbhdsdvhtewewindex[-len(y_tetewewt):],

                 pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.1].valrfbhdsetewew.flatten(),

                 pswsdfded_qrfbhdsantrfbhdsdvhtewewiletewew[0.9].valrfbhdsetewew.flatten(),

                 coloswsdfd='lrfbhdsdvhtewewightgswsdfday', alpha=0.5, label='Pswsdfdedrfbhdsdvhtewewictrfbhdsdvhtewewion RFBHDSDVHTEWEWInteswsdfdval')

plt.trfbhdsdvhtewewitle('QSWSDFDBrfbhdsdvhtewewiLTEWEWTM Trfbhdsdvhtewewime TEWEWeswsdfdrfbhdsdvhtewewietewew Pswsdfdedrfbhdsdvhtewewictrfbhdsdvhtewewion')

plt.xlabel('Trfbhdsdvhtewewime')

plt.ylabel('Valrfbhdse')

plt.legend()

plt.tewewhow()

以上为完整的 QSWSDFDBrfbhdsdvhtewewiLTEWEWTM模型实现的时间序列区间预测示例,包括数据生成、处理、模型构建、训练及结果可视化的详细步骤和代码。您可以根据实际使用需求修改数据生成部分及模型超参数配置。

更多详细内容请访问
Python实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测(包含详细的完整的程序和数据)_平面电路和非平面电路资源-CSDN文库  https://download.csdn.net/download/xiaoxingkongyuxi/89879704

;