热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

时间模式注意力时序预测TPALSTM

点击上方“算法数据侠”,选择“星标”公众号第一时间获取最新推文与资源分享小伙伴们周末愉快呀,我是oubahe。今天为大家分享的是有关多变量时间序列预测的算法 ——《Temporal Patt

点击上方“算法数据侠”,选择“星标”公众号

第一时间获取最新推文与资源分享

小伙伴们周末愉快呀,我是oubahe。今天为大家分享的是有关多变量时间序列预测的算法 ——《Temporal Pattern Attention for Multivariate Time Series Forecasting》,简称TPA-LSTM。TPA-LSTM主要的贡献在于将相关变量加权用于多变量时间序列预测,传统的attention机制会选择相关的时间步timesteps加权,而paper中的attention机制(Temporl Pattern Attention)会选择相关变量加权,下面我们通过原理结合代码介绍TPA注意力机制选择相关重要变量的内在机制。来吧,展示~

01

原理简介

模型框架主要包括3个部分:LSTM处理时间序列;2、CNN检测时间模式;3、注意力加权。

1.1 LSTM用于处理时间序列

对原始时间序列使用LSTMBlockCell处理,得到每个timesteps的隐状态h_i(列向量),每个h_i维度为m。其中,w是滑窗窗口长度,得到的隐状态矩阵H={h_t-w, h_t-w+1, ..., h_t-1}。因此,隐状态矩阵的行列向量意义:

A、行向量代表单个变量在所有时间步下状态,即同一变量的所有时间步构成的向量。

B、列向量代表单个时间步状态,即同一时间步下的所有变量构成的向量。

1.2 CNN检测时间模式(Temporal Pattern

利用卷积来捕获可变的信号模型,公式如下:

卷积配置为k个filters,kernel尺寸为1×T(T代表attention时所覆盖的范围,可理解为attn_length,通常令T=w),将上述kernel沿隐状态矩阵H的行向量计算卷积,提取该变量在该卷积核范围attn_length内的时间模式矩阵H^c。H_(i,j)表示第i个行向量和第j个卷积核作用的结果值。
1.3 注意力加权
A、令query=h_t,key=H^c,则scoring function为:
B、利用sigmoid函数进行归一化,得到变量注意力权重,便于选择多变量:
C、利用得到的注意力权重向量,对H^c每行做加权求和,得到上下文向量v_t:
备注:这里仅与最后一个隐向量h_t计算得分,最终的上下文向量表示对时间模式矩阵H^c行向量的加权求和,且其行向量代表单个变量的temporal pattern,因此TPA选择相关变量加权。
D、进一步对上下文向量与隐含层最后时刻输出分别进行线性映射后进行add操作,最终得到预测结果:
02

动手干
这里可以很容易地借助Tensorflow2深度学习框架来实现上述算法逻辑。

    from tensorflow.keras import losses
    import tensorflow.keras.backend as K
    from tensorflow.keras import regularizers
    from tensorflow.keras.models import Model
    from tensorflow.keras import optimizers
    from tensorflow.keras.layers import Input, Conv1D, Reshape, Lambda, Flatten
    from tensorflow.keras.layers import Layer, Dense, LSTM, Activation, Multiply, Add
    class CalculateScoreMatrix(Layer):
    def __init__(self, output_dim=None, **kwargs):
    self.output_dim = output_dim
    super(CalculateScoreMatrix, self).__init__(**kwargs)

    def get_config(self):
    cOnfig= super().get_config().copy()
    config.update({'output_dim': self.output_dim})
    return config

    def build(self, input_shape):
    self.kernel = self.add_weight(name='kernel',
    shape=(input_shape[-1], self.output_dim),
    initializer='uniform',
    trainable=True)
    super(CalculateScoreMatrix, self).build(input_shape)

    def call(self, x):
    res = K.dot(x, self.kernel)
    return res

    class TPALSTM:
    '''
    epochs: 最大迭代次数
    feat_dim:变量维数
        input_dim:时间步维度
    lr:学习率大小
    batch_size:批次大小
    units:隐藏单元个数
    model_name:模型名称
    filter_size:卷积核大小
    loss_fn:损失函数
    _estimators:训练模型保存字典
       '''
    def __init__(self, hidden_unit=32, filter_size=3, batch_size=32, epochs=50, learning_rate=1.2e-3):
    self.epochs = epochs
    self.feat_dim = None
    self.input_dim = None
    self.output_dim = None
    self.lr = learning_rate
    self.filters = hidden_unit
    self.batch_size = batch_size
    self.units = hidden_unit * 2
    self.model_name = "TPA-LSTM"
    self.filter_size = filter_size
    self.loss_fn = losses.mean_squared_error
    self._estimators = {}

    def build_model(self):
    inp = Input(shape=(self.input_dim, self.feat_dim))
    # convolution layer
    x = Conv1D(filters=self.filters, kernel_size=self.filter_size, strides=1, padding="causal")(inp)
    # LSTM layer
    x = LSTM(units=self.units,
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros",
    kernel_regularizer=regularizers.l2(0.001),
    return_sequences=True)(x)
    # get the 1~t-1 and t hidden state
    H = Lambda(lambda x: x[:, :-1, :])(x)
    ht = Lambda(lambda x: x[:, -1, :])(x)
    ht = Reshape((self.units, 1))(ht)
    # get the HC by 1*1 convolution
    HC = Lambda(lambda x: K.permute_dimensions(x, [0, 2, 1]))(H)
    score_mat = CalculateScoreMatrix(self.units)(HC)
    score_mat = Lambda(lambda x: K.batch_dot(x[0], x[1]))([score_mat, ht])
    # get the attn matrix
    score_mat = Activation("sigmoid")(score_mat)
    attn_mat = Multiply()([HC, score_mat])
    attn_vec = Lambda(lambda x: K.sum(x, axis=-1))(attn_mat)
    # get the final prediction
    wvt = Dense(units=self.filters * 4, activation=None)(attn_vec)
    wht = Dense(units=self.filters * 4, activation=None)(Flatten()(ht))
    yht = Add()([wht, wvt])
    # get the output
    out = Dense(self.output_dim, activation="sigmoid")(yht)
    # compile
    model = Model(inputs=inp, outputs=out)
    optimizer = optimizers.Nadam(learning_rate=self.lr)
    model.compile(loss=self.loss_fn, optimizer=optimizer)
    return model

    03


    结束语

    以上就是基于时间模式注意力的多变量时序预测算法TPA-LSTM的所有内容了,该算法主要是通过LSTM的隐含层输出来构建注意力权值向量,对变量维度进行加权,可以有效识别输入变量的重要性。但是相比于时间步模式注意力到底哪种注意力机制在实践中更为有效,还需要靠各位聪明的小侠客学以致用了哟,毕竟实践才是检验真理的唯一标准嘛。好啦,今天的内容就到这里啦,我是oubahe,我们下次再见咯~

    码字虽少,原创不易。分享是快乐的源泉,来个素质三连 —>点击左下角分享 —> 右下角点赞+在看本文,可以汇聚好运气召唤神龙哟~


    推荐阅读
    • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
    • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
      本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
    • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
    • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
      本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
    • sklearn数据集库中的常用数据集类型介绍
      本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
    • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
    • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
    • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
      本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
    • Android自定义控件绘图篇之Paint函数大汇总
      本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
    • Explain如何助力SQL语句的优化及其分析方法
      本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
    • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
    • 如何自行分析定位SAP BSP错误
      The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
    • CSS3选择器的使用方法详解,提高Web开发效率和精准度
      本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
    • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
    • web.py开发web 第八章 Formalchemy 服务端验证方法
      本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
    author-avatar
    手机用户2502908547
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有