2024/1/21周报

news2024/10/1 15:12:35

文章目录

  • 摘要
  • Abstract
  • 文献阅读
    • 题目
    • 问题与创新
    • 方法
      • RNN网络
      • LSTM网络
      • 目标变量与外部变量的相关性
    • 实验
      • 数据集
      • 评估准则
      • 参数设置
      • 实验结果
  • 深度学习
    • GRU
      • 网络结构介绍
      • 前向传播过程
      • 反向传播过程
      • 简单的GRU代码实现
  • 总结

摘要

本周阅读了一篇基于LSTM的深度学习模型用于长期旅游需求预测的文章,作者所提出的预测模型是基于长短期记忆网络(LSTM),它能够整合来自外生变量的数据。通过希腊三家酒店真实的数据的评估,结果表明,与所有三家酒店的知名国家的最先进的方法相比,所提出的模型的上级预测性能。此外,还对GRU进行推导和代码实现。

Abstract

This week, an article about the application of LSTM-based deep learning model to long-term tourism demand forecasting is readed. The forecasting model proposed by the author is based on long-term and short-term memory network (LSTM), which can integrate data from exogenous variables. Through the evaluation of real data of three hotels in Greece, the results show that the superior prediction performance of the proposed model is better than that of the most advanced methods in famous countries of all three hotels. In addition, GRU is deduced and implemented by code.

文献阅读

题目

LSTM-Based Deep Learning Models for Long-Term Tourism Demand Forecasting

问题与创新

旅游需求预测是整个旅游需求管理过程中的一项重要任务,因为它可以做出明智的决策,从而增加酒店的收入。

已有的相关文献中提出的旅游需求预测模型大多侧重于短期预测。然而,有效规划和管理旅游部门的企业需要长期预测。长期预测被认为是一项更困难的任务,因为它会引入误差积累和计算复杂性增加等问题。

作者通过引入深度学习模型进行长期旅游需求预测来填补相关文献中的上述空白的第一步。所提出的深度学习架构基于LSTM,并结合气象资料进行旅游预测。

主要贡献如下:
1.开发新的深度学习模型,用于准确的长期旅游需求预测,无论是否有外生变量(即天气数据);
2.调查外生变量对预测准确性的影响,特别是深度学习模型的性能;
3.使用真实世界的旅游相关数据和天气数据对所提出的模型进行评估的彻底实验过程。

方法

RNN网络

RNN中的节点除了当前时刻的典型信号外,还将其前一时刻的状态作为输入。隐藏节点h在时刻t的输出 在这里插入图片描述由以下等式给出:
在这里插入图片描述

RNN用于识别数据序列(或系列)中的模式,例如文本,基因组,声音信号,数字时间序列等。

LSTM网络

在这里插入图片描述

LSTM网络是一种RNN架构,它通过允许梯度在网络中反向传播而克服了消失梯度问题。一个常见的LSTM架构由一个单元(LSTM的内存)和三个控制LSTM内部信息流的门组成。具体来说,输入门控制新值流入单元的程度,遗忘门控制值保留到单元的程度,输出门控制单元中的值用于计算LSTM输出的程度。
在这里插入图片描述

LSTM网络的单元使用sigmoids上的元素操作来决定存储什么和留下什么,sigmoids是可微的,因此适合于反向传播。

目标变量与外部变量的相关性

作者建立了一个模型,除了旅游相关数据外,还集成了天气数据。使用了皮尔逊积差相关系数(PPMCC)估计旅游变量(即,房间预订数量)和天气变量,来确定哪些天气变量对预测目标更有用。PPMCC如下所示:
在这里插入图片描述

实验

数据集

为了评估建议和基准旅游需求预测模型,使用了来自希腊三家酒店的真实旅游需求数据。特别是,所使用的数据集包含希腊三家不同酒店在过去旅游季节的每一天的客房预订记录。出于数据隐私的考虑,作者使用Hotel A、Hotel B和Hotel C代指三家酒店。
在这里插入图片描述

评估准则

为了衡量所提出的模型和基准模型的预测性能,使用了旅游需求预测文献中广泛使用的两个预测误差指标,即均方根误差(RMSE)和平均绝对百分比误差(MAPE):
在这里插入图片描述
在这里插入图片描述

参数设置

作者使用的普通LSTMB与融合天气变量的LSTMX超参数值分别总结在表3和表4中:
在这里插入图片描述

实验结果

在这里插入图片描述

所提出的模型实现更好的预测性能在所有情况下相比,广泛用于旅游需求预测的六个不同的基准模型。此外,作者验证了假设,即来自外生变量(例如,天气数据),用于长期旅游需求预测的基础深度学习架构,可以显着提高其性能。

深度学习

GRU

网络结构介绍

GRU神经网络的整体结构与RNN神经网络的整体结构相同,区别在于GRU神经网络中的隐藏层单元引入了门控单元,其具体的结构如下图所示:
在这里插入图片描述

前向传播过程

在这里插入图片描述

传递参数:
在这里插入图片描述

前向传播的代码实现

#encoding=utf-8
import numpy as np

def sigmoid(x):
    return 1/(1 + np.exp(-x))
def tanh(x):

class GRUCell:
    def __init__(self,W_r,W_z,W_hh,U_r,U_z,U_hh,W_o,br,bz,bh,bo):
        self.W_r = W_r
        self.W_z = W_z
        self.W_hh = W_hh
        self.U_r = U_r 
        self.U_z = U_z
        self.U_hh = U_hh
        self.W_o = W_o
        self.br = br
        self.bz = bz
        self.bh = bh
        self.bo = bo
    
    def forward(self,X,S_prev):
        net_rt = np.dot(self.W_r.T,X)+np.dot(self.U_r,S_prev) + br
        rt = sigmoid(net_rt)
        net_zt = np.dot(self.W_z.T,X)+ np.dot(self.U_z,S_prev) + bz
        zt = sigmoid(net_zt)
        net_hht = np.dot(self.W_hh.T,X) + np.dot(self.U_hh.T,(rt * S_prev) + bh)
        hht = np.tanh(net_hht)
        St = (1 - zt) * S_prev + z(t) * hht 
        net_ot = np.dot(self.W_o.T,St) + bo
        Ot = sigmoid(net_ot)
        return net_rt,rt,net_zt,zt,net_hht,hht,St,net_ot,Ot

反向传播过程

首先分别计算误差关于nethh(t)、netz(t)、netr(t)、St-1的梯度运算,误差选用softmax函数交叉熵计算。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
权重参数求导如下:
在这里插入图片描述

在更新的时候,需要将所有的时刻的导数进行累加。以Wr为例,则最终更新公式为:
在这里插入图片描述

在设计GRU网络的时候,可能在最后的时刻才会有输出,此时,对于Wo,Bo的更新不需要按照时刻进行累加的过程。如果每一个时刻都有输出,则需要进行累加之后,进行更新。

简单的GRU代码实现

import torch
import torch.nn as nn
lstm_layer = nn.LSTM(3,5) #输入特征为3,隐含特征为5的特征量
gru_layer = nn.GRU(3,5)   #同样的隐含大小
sum(p.numel() for p in lstm_layer.paramenters()) #计算lstm总参数量,调用paramenters()函数,在对其进行参数枚举(p代表参数),p.numel()计算每个参数p的所有元素进行统计----》200
sum(p.numel() for p in gru_layer.paramenters())  ----->150
 
 
## GRU的参数量是LSTM的0.75

#准备工作
def gru_forward(input, initial_states, w_ih, w_hh, b_ih, b_hh)#定义函数,前向运算  initial_states提供初始状态 w权重--表示大的矩阵  b_ih偏置项
    prev_h = initial_states   #h t=0时刻的初始值
    bs, T, i_size = input.shape #对input进行拆解
    h_size = w_ih.shape[0] // 3 #公式里每一个 h_size(隐含神经元个数) 配三个权重
 
    #计算公式里的W ---由于目前提供的w是二维张量,而input和initial_states都是三维张量(带有batch这个维度)-----》对两个w进行扩充维度
    #对权重扩维,复制成batch_size倍
    batch_w_ih = w_ih.unsqueeze(0).tile(bs,1,1) #从第0维起扩一维,tile(bs,1,1)复制一下,第一维扩大到bs倍,其他保持不变
    batch_w_hh = w_hh.unsqueeze(0).tile(bs,1,1)

    output = torch.zeros(bs, T, h_size)  #对输出初始化  GRU网络的输出状态序列
 
#计算
    for t in range(T):     #for循环对每一时刻进行迭代更新  
        x=input(:,t,:) #step1:找到当前时刻的输入  t时刻GRU cell的输入特征向量,大小为[bs,i_size]
        w_time_x = torch.bmm(batch_w_ih, x.unsqueeze(-1))   #扩成3维---[bs,3*h_size,1]
        w_time_x = w_time_x.squeeze(-1)   #.squeeze(-1)去掉维度为1的维度---[bs,3*h_size]
        w_time_h_prev = torch.bmm(batch_w_hh, prev_h.unsqueeze(-1))   
        w_time_h_prev = w_time_h_prev.squeeze(-1)   
#计算重置门和更新门
        r_t = torch.sigmoid(w_time_x[:, :h_size]+w_time_h_prev[:, :h_size]+b_ih[:h_size]+b_hh[:h_size])
        z_t = torch.sigmoid(w_time_x[:, h_size:2*h_size]+w_time_h_prev[:, h_size:2*h_size]+b_ih[h_size:2*h_size]+b_hh[h_size:2*h_size])
#计算候选状态nt
        n_t = torch.tanh(w_time_x[:, 2*h_size:3*h_size]+b_ih[2*h_size:3*h_size]+\
                     r_t*(w_time_h_prev[:,2*h_size:3*h_size]+b_hh[2*h_size:3*h_size]))  #候选状态
      
        prev_h = (1-z_t)*n_t+z_t*prev_h  #增量更新得到当前时刻最新隐含状态
        output[:, t, :] = prev_h         #把 prev_h 喂入到output矩阵中
 
    return output, prev_h

#测试函数的正确性--用pytprch的官方api测试
 
bs, T, i_size, h_size = 2, 3, 4, 5
input = torch.randn(bs, T, i_size) #输入序列
h0 = torch.randn(bs, h_size) #初始值,不需要训练
 
#定义GRU量   调用官方GRU API
gru_layer = nn.GRU(i_size, h_size ,batch_first=True)
output, h_final = gru_layer(input, h0.unsqueeze(0))
print(output)
for k, v in gru_layer.named_parameters():
    print(k, v.shape)
 
#调用自定义的gru_forward函数
output_custom, h_final_custom = gru_forward(input,h0,gru_layer.weight_ih_10,gru_layer.weight_hh_10,gru_layer.bias_ih_10,gru_layer.bias_hh_10)
print(torch.allclose(output,output_custom)) #allclose对比两个浮点型张量是否非常接近
print(torch.allclose(h_final,h_final_custom_custom))

总结

本周对GRU的数学原理进行推导和补充学习,GRU也是基于RNN结构,并对LSTM进行简化。值得注意的是,GRU和LSTM适用于不同的场景,GRU训练速度要快于LSTM。

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

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

相关文章

大数据开发之Kafka(概述、快速入门、生产者)

第 1 章:Kafka概述 1.1 定义 Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。 发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只…

性能测试、分析、优化

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,薪资嘎嘎涨 前言 理论来源于实践又服务于实践,在笔者…

【算法与数据结构】518、LeetCode零钱兑换 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题的硬币是无数的,因此本题可以抽象成一个完全背包问题。完全背包和01背包的不同之处在于…

LoadRunner从零开始之接触LoadRunner

LoadRunner 是Mercury Interactive 公司开发的一款成熟的性能测试工具,LoadRuner 作为性能测试的实现者,涉及了性能测试流程、性能测试技术和软件 体系架构等众多方面的知识点,可以说,学习LoadRuner 是理解和学习性能测试 的非常好…

常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)

前言 有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式) 工程方法 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设…

Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

在我们的项目开发中,我们都会对数据返回格式进行统一的处理,这样可以方便前端人员取数据,当然除了正常流程的数据返回格式需要统一以外,我们也需要对异常的情况进行统一的处理,以及项目必备的日志。 1. 统一返回格式 …

【小沐学GIS】基于C++绘制三维太阳系SolarSystem(OpenGL、glfw、glut)

🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…

深度学习基础之数据操作

深度学习中最常用的数据是张量,对张量进行操作是进行深度学习的基础。以下是对张量进行的一些操作: 首先我们需要先导入相关的张量库torch。 元素构造(初始化) 使用arange创造一个行向量,也就是0轴(0维&a…

LabVIEW 2023下载安装教程,附安装包和工具,免费使用,无套路获取

前言 LabVIEW是一种程序开发环境,提供一种图形化编程方法,可可视化应用程序的各个方面,包括硬件配置、测量数据和调试,同时可以通过FPGA数学和分析选板中的NI浮点库链接访问浮点运算功能库,LabVIEW软件是NI设计平台的…

西圣H1头戴式耳机发布,不止音质惊艳,更有舒适听音体验

近日,深耕智能声学领域多年的 xisem西圣品牌‏‏发布——‏西圣H1头戴式主动降噪蓝牙耳机正式迎来首销。从各个方面来看,这款头戴式耳机展现出了极具颠覆性的创新,不仅在音质和降噪性能上表现出色,更重要的是采用了更加轻巧的佩戴…

使用记事本修复DBC文件问题V3.0

要麻了,竟然写到3.0了。 有个信号解析不出来,同一条报文的其他信号可以正确解析,打开DBC检查,位置长度都是正确的,死活解析不出来。 打开记事本 发现他居然在信号后面加了个回车,就产生了上面这种诡异的情…

js实现九九乘法表

效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">// 输出乘法口诀表// document.write () 空格 " " 换行…

微电网优化MATLAB:火鹰优化算法(Fire Hawk Optimizer,FHO)求解微电网优化(提供MATLAB代码)

一、火鹰优化算法FHO 火鹰优化算法&#xff08;Fire Hawk Optimizer&#xff0c;FHO&#xff09;由Mahdi Azizi等人于2022年提出&#xff0c;该算法性能高效&#xff0c;思路新颖。 单目标优化&#xff1a;火鹰优化算法&#xff08;Fire Hawk Optimizer&#xff0c;FHO&#…

QKCP容器平台安装qkcp paas deployment

22年底23年初做的容器云平台的项目&#xff0c;该份是当初实施部署真实生产环境的手册&#xff0c;关键ip和端口已经更改&#xff0c;现贴来给大伙参阅。 x公司qkcp容器平台安装部署手册 目录 x公司qkcp容器平台安装部署手册 1 集群基础环境 3 1.1. 集群规划信息 3 1.2. 标准…

Eclipses安装教程

一、下载开发工具包 1、开发工具包JDK 下载地址链接&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 下载教程&#xff1a; 1&#xff09;点击链接&#xff0c;可以跳转到页面 2&#xff09;下滑页面&#xff0c;找到开发工具包 3&#xff09; 记住下载之…

数据库管理Navicat Premium 15

Navicat Premium 15是一款强大的数据库管理和开发工具&#xff0c;支持多种数据库类型&#xff0c;包括MySQL、MariaDB、SQL Server、SQLite、Oracle和PostgreSQL等。它提供了数据可视化、高效的操作、数据同步与备份等功能&#xff0c;以及用户友好的界面。Navicat Premium 15…

【数据库原理】(37)Web与数据库

随着网络的高速发展和网络服务的日趋完善&#xff0c;网络上的信息量呈几何级数增长。为了有效地组织、存储、管理和使用网上的信息&#xff0c;数据库技术被广泛地应用于网络领域。特别是在Internet上&#xff0c;已建立了数以万计的网站&#xff0c;其中大中型网站的后台大多…

2.4 网络层01

2.4 网络层01 2.4.1 网络层概述 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 异构网络内部的计算机要想实现通信是不需要实现网络互联的&#xff0c;异构网络之间要想实现通信就必须实现网络互连。 路由器工作在五层协议体系结构的网络…

Android:JNI实战,加载三方库、编译C/C++

一.概述 Android Jni机制让开发者可以在Java端调用到C/C&#xff0c;也是Android应用开发需要掌握的一项重要的基础技能。 计划分两篇博文讲述Jni实战开发。 本篇主要从项目架构上剖析一个Android App如何通过Jni机制加载三方库和C/C文件。 二.Native C Android Studio可…

python一元线性回归sklearn

# -*- coding: utf-8 -*-from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt# 载入数据 data np.genfromtxt(一元线性回归.csv, delimiter,) x_data data[:,0] y_data data[:,1] plt.scatter(x_data,y_data) plt.show(…