机器学习周记(第三十三周:文献阅读[GWO-GART])2024.4.1~2024.4.7

目录

摘要

ABSTRACT

1 论文信息

1.1 论文标题

1.2 论文摘要 

1.3 论文数据集

1.4 论文模型

2 相关知识


摘要

  本周阅读了一篇使用GAT结合GRU预测PM2.5浓度的文章。论文模型为图注意力循环网络(GART),首次提出了一种新型的多层GAT架构,可以循环地提取城市的空间特征,并获取城市之间更多的隐含关联。其次,利用灰狼优化(GWO)来选择模型的最佳超参数集。这种自动化方法有助于优化GART的网络结构。

ABSTRACT

This week, We read a paper on predicting PM2.5 concentration using Graph Attention Network (GAT) combined with Gated Recurrent Unit (GRU). The model proposed in the paper is called Graph Attention Recurrent Network (GART), which introduces a novel multi-layer GAT architecture for cyclic extraction of spatial features of cities, thereby capturing more implicit associations between cities. Furthermore, Grey Wolf Optimization (GWO) is employed to select the optimal set of hyperparameters for the model. This automated approach aids in optimizing the network structure of GART.

1 论文信息

1.1 论文标题

A long-term prediction method for PM2.5 concentration based on spatiotemporal graph attention recurrent neural network and grey wolf optimization algorithm

1.2 论文摘要 

  随着全球工业化和城市化的迅速发展,空气污染问题变得日益严重,主要以PM2.5作为主要污染成分,直接影响了人们的健康。因此,对长期PM2.5水平进行预测是非常有必要的。然而,大多数现有的PM2.5浓度预测方法缺乏足够的提取城市空间特征的能力。因此,本文提出了一种基于时空图注意力循环神经网络灰狼优化(GWO-GART)的新方法。首先,通过使用图注意力网络(GAT)图神经网络(GNN)门控循环单元(GRU)构建了一个PM2.5的长期预测模型,称为图注意力循环网络(GART)。在GART模型中,首次提出了一种新型的多层GAT架构,可以循环地提取城市的空间特征,并获取城市之间更多的隐含关联。其次,利用灰狼优化(GWO)来选择模型的最佳超参数集。这种自动化方法有助于设计GART的网络结构。最后利用从现实世界收集的数据集将GWO-GART与三种单一模型和两种混合模型进行了比较。结果显示,与最先进的模型(SOTA)相比,GWO-GART在所有数据集上的均方根误差(RMSE)平均减少了2.13%,平均绝对误差(MAE)减少了2.47%,临界成功指数(CSI)平均增加了1.55%。这表明,GWO-GART提供了一种切实有效的方法,可以准确预测城市地区的长期PM2.5水平。

1.3 论文数据集

  本文选取中国184个城市区域进行PM2.5浓度预测研究,如Fig.1所示。大气污染受环境因素和地理因素的影响,包括空气湿度、地表温度、降水、大气压等。而且,特定位置的空气污染水平不仅受到当地排放的影响,还受到邻近地区污染的影响。以京津冀地区为例,北京PM2.5浓度受到天津、廊坊等多个地区工业排放的影响。因此,工厂排放的空气污染物的扩散往往受到地理因素的影响,如地点之间的距离、海拔差异、高山、强气流和风向等。为了充分考虑这些因素对PM2.5浓度沉降和扩散的影响,将每个城市节点的属性值由8个气象和环境数据组成,包括:海拔高度、k指数、经度风分量U、纬度风分量V、相对湿度、2m处地面温度、大气压和总降水量。具体数据统计如Table1所示。

Fig.1 研究区域的地理分布图
Table1 

  每个城市的PM2.5浓度数据来自生态环境部(MEE),而气象和环境指标则来自ERA5大气再分析数据集。这些指标通过热力学效应与PM2.5的垂直扩散动态相关。连接相邻城市节点的边的属性包括以下6个因素:两个城市节点之间的距离(d);起始城市节点风速(v);从起始城市到目标城市的方向(\gamma);起始城市节点风向(\beta);水平扩散系数(S);注意力系数(Y)。这些因素与PM2.5的水平扩散有关。水平扩散系数S的计算公式如Eq.(1)所示。

S=ReLU(\frac{\left | v \right |}{d} \cos (\left | \gamma -\beta \right |))                                                                                                   (1)

1.4 论文模型

  论文模型(GWO-GART),如Fig.2所示,主要由两部分组成:(1).GART预测模型,主要由多层GAT多层GNN以及一个GRU层组成。在GART中,空间特征通过多层GAT提取,而气象环境特征通过多层GNN提取。接着,将被提取的多个特征通过特征融合连接起来,GRU层进一步捕获数据的时间特征。(2).灰狼优化算法(GWO),用于优化GART的网络结构。 

Fig.1 GWO-GART总体架构
Fig.2 GWO-GART总体架构

  利用数据集提供的184个城市的空气质量数据、地理环境数据和经纬度信息,构建了城市的图结构和邻接矩阵。PM2.5等空气污染物的水平迁移随着两地距离的增加而减少。同样,在两个地点之间存在大量高海拔山脉也会影响空气污染物的水平迁移。因此,基于这两个视角构建邻接矩阵。通过查询城市的经纬度信息,如果两个节点之间的欧氏距离大于300公里,或者节点之间有3座及以上海拔超过1200米的山脉,则认为节点之间没有边。邻接矩阵的具体约束如Eq.(2)Eq.(3)Eq.(4)所示。

d_{ij}=\left \| \alpha _{i}-\alpha _{j} \right \|                                                                                                                         (2)

m_{ij}=sup\left \{ h(\lambda \alpha _{i} + (1-\lambda )\alpha _{j}) - \max \left \{ h(\alpha _{i}),h(\alpha _{j}) \right \} \right \},\lambda \in (0,1)                            (3)

A_{ij}=H(d_{T}-d_{ij}) \cdot H(m_{T}-m_{ij})                                                                                       (4)

节点的地理坐标用\alpha表示,高度用h(\alpha )表示。m_{ij}表示节点i和节点j之间的山脉中的最大高度差。符号\left \| \cdot \right \|表示向量的L2范数,d_{ij}表示两个节点之间的欧氏距离。d_{T}为距离阈值(300km),m_{T}为高度阈值(1200m)。H(\cdot)是赫维赛德函数,只有当x>0时,其值为1,否则为0。

  构建邻接矩阵后,两个节点之间具有非零值的节点称为邻接节点,共有3938组,这意味着整个城市图有3938条边。分别计算这些边对应的属性,形成城市信息,用于后续的水平扩散系数S注意力系数Y的计算。

  GART模型将组织好的城市信息气象环境知识作为多层GNN的输入,充分提取气象环境数据的特征。其目标是输出融合气象和环境知识特征的融合数据。另外,基于邻接矩阵和节点特征,GART将其输入到多层GAT中提取PM2.5的空间特征。它的输出融合了空间特征的数据。然后,模型对上述两类数据进行特征融合。融合后的数据通过GRU层来反映PM2.5在时间序列上的沉积和消散,从而提取时间维度上的长期特征。为了紧密融合不同特征信息,采用全连接层将数据降维为一维。这代表了PM2.5的最终预测值。GWO通过参数组合对GART预测模型进行进一步优化,得到GWO-GART预测模型。GWO改善了多个模型之间的兼容性,增强了模型的预测精度。

  GART模型采用多层GNNMLP层融合气象和环境知识,如Fig.3所示。在Fig.3中,当预测时间tPM2.5浓度时,输入包括气象数据O^{t}、节点的城市信息G^{t},以及上一个时间步的历史PM2.5数据P^{t-1}。经过多层GNN的处理后,得到了一个包含气象和环境特征的融合向量X^{t}作为输出。接下来,X^{t}被用作后续步骤中下一个GNN层的输入。通过所有GNN层融合气象和环境知识后,采用两个MLP层。第一个MLP层将输入特征向量X^{t+n}的维度从低维度增加到高维度,而第二个MLP层将这个高维向量的维度降低。这使得不同特征向量之间的信息融合,并且使模型能够获得更全面的表达能力。最终输出X^{out}代表了气象和环境知识的融合。

Fig.3 多层GNN

计算公式如下:

X^{t}=\textup{GNN}(O^{t},P^{t-1},G^{t})                                                                                                            

X^{t+1}=\textup{GNN}(O^{t+1},P^{t},G^{t+1},X^{t})                                                                                        

...

X^{t+n}=\textup{GNN}(O^{t+n},P^{t+n-1},G^{t+n},X^{t+n-1})                                                                     

X^{out}=\textup{MLP}_{2}(\textup{MLP}_{1}(X^{t+n}))                                                                                                (5)

气象数据O^{t}包括12个特征,其中包括城市节点在时间t的8个气象和环境特征,两个时间特征,以及风速特征和风向特征。城市信息G^{t}包括在时间t的3938条边的属性信息以及基于边属性计算的水平扩散系数S

  在PM2.5的长期预测中,空间特征的提取至关重要,它反映了城市节点之间的邻接关系,并包含了城市图的空间特征。本文提出了一种多层GAT循环网络,如Fig.4所示。它不仅考虑了每一层的当前输入,还考虑了前一层GAT输出的影响。通过多层GAT完全提取邻接矩阵中隐含的空间信息,也是该模型功能的关键组成部分之一。多层图注意力(Multi-GAT)Fig.4所示。在时间tGAT 将节点特征F^{t}和邻接矩阵A作为输入。GAT的输出是注意力系数Y^{t}F^{t}包括八个气象和环境特征,这些节点特征随时间变化。A是一个184×184维的矩阵,涵盖了所有城市节点之间的空间关系。多层图注意力循环网络通过为每条边计算注意力系数来量化空间关系的强度。

Fig.4 多层GAT

具体计算过程如Eq.(6)所示:

Y^{t}_{ij}=\frac{\textup{ln}(LeakyReLU(a\left [ WF^{t}_{i} \left | \right | WF^{t}_{j} \right ]))}{\sum_{j\in N_{i}}^{}\textup{ln}(LeakyReLU(a\left [ WF^{t}_{i} \left | \right | WF^{t}_{k} \right ]))}                                                                                   (6)

其中,N_{i}代表节点i的所有邻居节点,jN_{i}中的一个节点;F^{t}表示时间t的节点特征;W是用于不同节点的共享参数矩阵;W\cdot F^{t}是两个向量的内积运算;\cdot ||\cdot表示在增加节点维度后的连接操作;a(\cdot)是用于减小连接后高维向量维度的单层前馈神经网络;Wa(\cdot)都是方程中的可学习参数。注意力系数Y经过归一化处理,如Eq.(7)所示,其中使用LeakyReLU激活函数以保留节点自身的特征信息,并防止在计算过程中被丢弃。然后,Y^{t}作为下一层GAT的输入,参与后续的计算。

具体计算过程如Eq.(7)所示:

Y^{t}=\textup{GAT}(F^{t},A)

Y^{t+1}=\textup{GAT}(F^{t+1},A,Y^{t})

...

Y^{t+n}=\textup{GAT}(F^{t+n},A,Y^{t+n-1})                                                                                             (7)

Eq.(7)可以观察到,空间依赖关系随着时间变化,因为多层GAT在计算下一个时间步的注意力系数时考虑了上一个时间步的注意力系数。而且数据是每隔3小时收集一次的,包括风速、温度、湿度和降水等特征,所有这些特征都可能发生波动,进而影响PM2.5的扩散。这些特征变化也受到上一个时间步的影响,这就是本文采用循环方法更有效地提取空间依赖关系的原因。模型将传统的图注意力网络转换为类似于RNN的循环结构,目的是适应这些特征的变化。

在计算完注意力系数后,通过聚合所有邻居节点的信息来更新节点自身的特征F{}',如Eq.(8)所示。

F{}'_{i}=\sigma (\sum_{j\in N_{i}}^{}Y^{t}_{j}WF^{t}_{i})                                                                                                           (8)

其中,N_{i}是与中心城市i相邻的城市集合,而j是其中的任意一个相邻城市。Y^{t}_{j}表示时间t时城市ij之间的注意力系数。W是共享参数矩阵,而F^{t}_{i}表示时间t时城市i的节点特征。Eq.(8)表示将城市之间的注意力系数视为权重系数,反映了相邻城市对PM2.5扩散的贡献。注意力系数越大,权重越高。根据不同的权重,所有的局部特征被聚合以更新i的特征信息F{}'_{i},从而影响PM2.5的预测。

在每个GAT层中,都采用了多头注意力机制,如Fig.4中的绿色区域所示。通过多头注意力机制,模型可以使用不同的可学习参数集合集中于问题的不同方面。每个彩色箭头代表一组注意力参数,对应于Fig.4中的三头注意力机制。然后,来自多个头的注意力结果被聚合以更新节点特征。

引入了多头注意力机制后,节点信息的更新根据Eq.(9)进行。

F{}'_{i}=\sigma (\frac{1}{K}\sum_{k=1}^{K}\sum_{j\in N_{i}}^{}Y^{t}_{j}W^{k}F^{t}_{j})                                                                                         (9)

其中,K表示注意力头的数量,每个头专注于不同的方面,可以使用Wa(\cdot)进行调整。在为每个头计算完注意力系数后,每个头专注于不同的方面,形成一个新的特征向量F{}',其中包含来自相邻节点的信息。

  PM2.5浓度表现出显著的时间变化。随着时间步长的增加,不确定性增加,这使得提取PM2.5的长期时间特征变得具有挑战性。因此,在本文中,将来自相应时间段的空间特征、气象和环境特征结合起来,以改善模型在提取时间特征时的预测性能。特征融合的目的是将来自不同领域提取的特征数据集成到一个统一的表示中,从而为提取时间特征提供更全面的输入。

  为了整合来自不同领域提取的特征,本文采用了多维特征串联融合,如Fig.5所示。该图描述了从时间步长tt+n的特征融合过程。在时间步长tX^{t}表示通过多层GNN融合气象和环境知识后获得的高维数据。Y^{t}对应于通过多头GAT提取空间特征后获得的高维数据。P^{t}表示时间步长t的气象和环境数据,具体包括PM2.5值和气象特征(类似于多层GNN的输入O^{t})。在每个时间步长,这三部分数据被串联起来形成N^{t}。这个过程在n个时间步骤中重复进行,产生nN^{t}向量,对应于单个时间步骤。然后,这些n个向量再次串联起来形成高维数据M_{t}。在完成特征串联融合后,M_{t}进一步通过GRU进行后续时间特征提取处理。

Fig.5 特征融合

  GART模型结合了多个深度学习模型,用于提取时间特征和空间特征。因此,整体模型结构变得复杂,具有大量参数和高维向量,增加了参数调整和模型优化的难度。然而,引入GWO为解决这一问题提供了有效的解决方案。

GART模型的GWO优化的主要步骤如下:

step1:定义需要优化的GART参数,并确定它们的上下边界。

step2:初始化GWO的三个参数:灰狼种群大小(Wolf_num)、要优化的参数数量(dim)和允许的最大迭代次数(Max_iterations)

step3:初始化可训练参数aAC。其中,参数a的具体计算如Eq.(10)所示。

a=\frac{2*(Max\_iterations-t)}{Max\_iterations}                                                                                                           (10)

step4:计算GART的适应度,依次选择三个最低适应度值,并按升序将它们分配给αβδ狼。具体来说,根据step1的规定,生成适用于Wolf_num个参数组合,并将它们用作GART计算的输入。适应度由在验证集上的最佳损失值确定,其计算方式如Eq.(11)所示。

\textup{Val}_{loss}(x_{i},x{}'_{i})=\frac{\sum_{i=1}^{n}(x_{i}-x_{i}{}')^{2}}{n}                                                                                                (11)

其中,n是城市节点的数量,x_{i}是预测的PM2.5浓度,x_{i}{}'是真实的PM2.5浓度。基于模型返回的验证集损失值进行GWO优化。较小的损失值表示更高的预测准确性,表明GWO优化过程更接近最优解。

step5:更新参数aAC。计算猎物与灰狼之间的距离D,然后更新Omega狼的位置,将GART参数移动到最优组合附近。

step6:根据更新后的参数,通过代入GART计算Fitness。按顺序重新分配三个最小值给αβδ狼,并将最小值分配给X_{best}

step7:迭代Max_iterations次,持续更新X_{best}

step8:输出GART的最佳参数组合X_{best},并结束GWO的优化过程。

Fig.6 GWO优化

2 相关知识

  GAT(图注意力)的本质是让每一个节点和其他的节点计算AttentionAttention的方式有两种,一种是Global Graph Attention,即让当前节点和所有其他节点作Attention计算;另一种是Mask Graph Attention,即让当前节点只与邻居节点作Attention计算。Global Graph Attention的方式会缺失图的结构特征,因为在图结构数据中一个节点通常不会和其他所有节点都有边,如果计算与其他所有节点的Attention则会忽略掉这些节点是否与当前节点相邻这一信息,同时Global Graph Attention的计算量巨大。相反,Mask Graph Attention不会缺失图的结构特征,而且计算成本更小。

  GAT的具体计算流程如下。第一步,逐点计算节点i与其邻居节点N_{i}之间的注意力系数,计算公式为e_{ij}=a([Wh_{i}||Wh_{j}]),j \in N_{i}a_{ij}=\frac{exp(LeakyReLU(e_{ij}))}{\sum_{k\in N_{i}}^{} exp(LeakyReLU(e_{ik}))}。其中W为共享参数,对h_{i}h_{j}作线性变换;[\cdot || \cdot]表示拼接操作;a将拼接后的高维特征映射到一个实数上;a_{ij}是使用softmax归一化后的注意力系数。第二步,加权求和,公式为h{}'_{i}=\sigma (\sum_{j\in N_{i}}^{} a_{ij}Wh_{j}),至此节点更新完毕。

GAT代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F


class GATLayer(nn.Module):
    def __init__(self, in_features, out_features, dropout, alpha, concat=True):
        super(GATLayer, self).__init__()
        self.in_features = in_features  # 定义节点向量的特征维度
        self.out_features = out_features  # 经过GAT之后的特征维度
        self.dropout = dropout  # dropout参数
        self.alpha = alpha  # LeakyReLU的参数

        # 定义可训练参数,即公式中的W和a
        self.W = nn.Parameter(torch.zeros(size=(in_features, out_features)))
        nn.init.xavier_uniform_(self.W.data, gain=1.414)  # xavier初始化
        self.a = nn.Parameter(torch.zeros(size=(2 * out_features, 1)))
        nn.init.xavier_uniform_(self.a.data, gain=1.414)  # xavier初始化

        # 定义LeakyReLU
        self.LeakyReLU = nn.LeakyReLU(self.alpha)

    def forward(self, input_h, adj):
        """
        :param input_h: [N, in_features]
        :param adj: 图的邻接矩阵,维度[N,N]
        :return: output_h
        """
        h = torch.mm(input_h, self.W)  # [N, out_features]
        N = h.size()[0]  # 图的节点数
        input_concat = torch.cat([h.repeat(1, N).view(N * N, -1), h.repeat(N, 1)], dim=1).view(N, -1,
                                                                                               2 * self.out_features)
        e = self.LeakyReLU(torch.matmul(input_concat, self.a).squeeze(2))

        zero_vec = -1e12 * torch.ones_like(e)
        attention = torch.where(adj > 0, e, zero_vec)
        attention = F.softmax(attention, dim=1)
        attention = F.dropout(attention, self.dropout, traning=self.training)
        output_h = torch.matmul(attention, h)

        return output_h

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-简单点-python中的多重继承mro和super的联系

在Python的多重继承中,super()函数的作用主要是确保父类的方法被正确地调用,同时避免了直接调用父类可能带来的问题,如方法覆盖或名称冲突。super()的使用是Python实现合作式多重继承的关键。 具体来说,当一个类从多个父类继承时…

HTTP 摘要认证

文章目录 一、什么是摘要认证二、工作流程三、实例演示 一、什么是摘要认证 摘要认证,即 Digest Access Authentication,是一种HTTP身份验证机制,用于验证用户的身份。相较于基本认证(Basic Authentication)使用用户名…

Qt快速入门到熟练(3.程序运行发布与设置图标)

程序运行发布 当我们执行过qt过后,将会在项目目录里面生成出一个debug构建目录,点击进去选择debug文件夹,就可以看到我们生成出来的可执行文件。 很显然我们的项目就叫做MyFirstWidget,所以生成的可执行文件在没有人为设置的情…

CLR学习

视频链接:《CLR十分钟》系列之CLR运行模型_哔哩哔哩_bilibili 什么是 CLR 公共语言运行时(Common Language Runtime CLR) 是一个可有多种编程语言使用的 运行时,CLR 的核心功能(比如 内存管理,程序集加载…

notion的使用心得

从老石的视频知道了notion是一个很强大的管理工具:这就是最棒的效率软件!如果不是,我倒想试试你的 | Notion使用技巧分享_哔哩哔哩_bilibili 我一时半会不能全部学会,但是借用大家的好模板:如何用5分钟搭建简洁高效的…

html5分步问卷调查表模板源码

文章目录 1.设计来源1.1 问卷调查11.2 问卷调查21.3 问卷调查31.4 问卷调查41.5 问卷调查51.6 问卷调查6 2.效果和源码2.1 完整效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/137454703 html5分…

React 项目配置代码提交规范 ESLint、Pretttier、Husky、CommitLint

React 项目配置代码提交规范 ESLint、Pretttier、Husky、CommitLint 前言 团队开发的成员越来越多,项目都是由多个人进行开发和维护,每个人的代码书写习惯和风格又不尽相同,commit 的提交log 也是乱七八糟,为以后的开发和维护增…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时,添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送,不仅上传缓慢,对方查收下载时还有有效期限制,7天或15天后就过期再也无法下载了,有没有什么办法可以压缩PPT等文档&#xff0…

python3内置持久化模块shelve心得

python3内置持久化模块shelve心得 来自python官方网站的解释: https://docs.python.org/zh-cn/3.10/library/shelve.html 本文环境: Windows 10 专业版 64 位 Thonny 3.2.6 概述 内置模块 shelve 可以将任意 Python 对象(即 https://docs…

第29篇:秒表计时器

Q:本期我们采用计数器来实现秒表计时器,循环进行0~9计时。 A:在数码管HEX0上循环从0到9计数,间隔时间为1s,使用计数器实现1s时间间隔。 DE2-115开发板提供了50MHz时钟,触发器直接以50MHz信号作为同步时钟…

C++ | Leetcode C++题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxArea(vector<int>& height) {int l 0, r height.size() - 1;int ans 0;while (l < r) {int area min(height[l], height[r]) * (r - l);ans max(ans, area);if (height[l] < height[r…

鸿蒙实现一种仿小红书首页滑动联动效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 效果描述&#xff1a;通过手指滑动列表&#xff0c;控制位置显示效果为&#xff1a;不论列表在什么位置下滑时下图粉色位置布局显示&#xff0c;手指上滑时下图粉色位置布局隐藏。 效果&#xff1a; 原理分析&…

简单介绍css及其代码样式

css简介 css用于前端开发&#xff0c;负责对界面进行美化。让页面更美观。 他可以改变html代码的样式&#xff0c;让html代码的网页不那么死板。 css代码格式 选择器 {属性:值; 属性:值&#xff1b;} css的模版架构 css代码放到<style>标签中。 而<style>通常是…

2024/4/7周报

文章目录 摘要Abstract文献阅读题目引言创新点Decoder-Encoder模型实验过程实验结果 深度学习LSTM变体Bidirectional LSTM&#xff08;双向LSTM&#xff09;GRUGRU代码实现 总结 摘要 用于统计机器翻译的RNN编码器-解码器学习短语表示 文中提出了一种新的神经网络模型称为RNN编…

博客评论回复03

接着之前写的&#xff0c;之前返回的数据集按道理来说渲染出来还是丑丑的&#xff0c;因此这次我看着抖音的评论样子&#xff0c;自己瞎写了一通&#xff0c;不过也算是模仿出来了虽然肯定没有抖音写的好。 类似与前面几章写的表结构 首先看看抖音评论区是怎么样的&#xff1f…

消息队列之RabbitMQ的安装配置

一&#xff0c;前言 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息队列在分布式系统开发中应用非常广泛。点击跳转RabbitM…

前端开发学习笔记 3 (Chrome浏览器调试工具、Emmet语法、CSS复合选择器、CSS元素选择模式、CSS背景)

文章目录 Chrome浏览器调试工具Emmet语法CSS复合选择器后代选择器子选择器并集选择器伪类选择器 CSS元素选择模式元素选择模式概述CSS块标签CSS行内标签CSS行内块标签CSS元素显示模式转换 CSS背景CSS背景颜色CSS背景图片CSS背景图片平铺CSS背景图片位置CSS背景图片固定CSS背景复…

HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService

HIS系统是什么&#xff1f;一套前后端分离云HIS系统源码 接口技术RESTful API WebSocket WebService 医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等&…

275. 传纸条(DP)

题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。一次素质拓展活动中&#xff0c;班上同学安排坐成一个 m 行 n 列的矩阵&#xff0c;而小渊和小轩被安排在矩阵对角线的两端&#xff0c;因此&#xff0c;他们就无法直接交谈了。幸运的是&…

CMU15/445 2023 Spring-project1 LRU-K 替换策略

在写个demo之前&#xff0c;专门学习了LRU:【LeetCode刷题】146. LRU 缓存-CSDN博客 使用哈希表 双向链表可以满足删除/增加的时间复杂度为O(1)。 在通读完15/445这块的说明之后&#xff0c;发现和LRU还是有些差别的。 官方文档中对LRU-K的解释是&#xff1a;LRU-K算法根据所…