Informer:高效长序列时间序列预测模型(更新中)

文章行文思路:
在这里插入图片描述

目录

  • 一、背景:
    • 1.时间序列介绍:
    • 2.LSTF介绍:
    • 3.Transformer与Informer的关系:
  • 二、Transformer:
    • 1.Transformer简介:
    • 2.Transformer整体架构:
    • 3.模型输入:
      • 3.1第一层Encoder输入:
        • 3.11 细节说明:
          • 3.111 “token”解释:
          • 3.112 Embedding原理:
          • 3.113 Positional Encoding原理:
          • 3.114 “特征”解释:
      • 3.2 第一层Decoder输入:
        • 3.21 细节说明:
          • 3.211 “标签列”解释:
    • 4.Encoder:
      • 4.1 Encoder组成与功能:
      • 4.2 Self-Attention:
      • 4.3 Multi-Head Attention:
      • 4.4 Add残差连接:
      • 4.5 Norm层归一化:
      • 4.6 Feed-Forward Networks:
      • 4.7 Encoder堆叠:
    • 5.Decoder:
      • 5.1 Decoder组成与功能:
      • 5.2 Masked Multi-Head Attention:
      • 5.3 Multi-Head Attention:
      • 5.4 Decoder堆叠:
    • 6.模型输出:
    • 7.Transformer训练和预测过程总结:
  • 三、Informer:
    • 1.简介:
    • 2.传统Transformer在时序预测方面缺点和Informer改进方法:
    • 3.Informer整体架构:
    • 4.Informer优化详解:
      • 4.1 ProbSparse Self-attention:
      • 4.2 Self-attention Distilling:
      • 4.3 Generative Style Decoder:
      • 4.4 Positional Encoding:
    • 5.模型输入输出角度理解Informer训练和预测过程:
      • 5.1 Encoder Embedding输入:
      • 5.2 Decoder Embedding输入:
      • 5.3 Embedding输入输出:
        • 5.31 输入:
        • 5.32 输出:
      • 5.4 ProbSparse Self-attention输入输出:
        • 5.41 输入:
        • 5.42 Active输出:
        • 5.43 Active+Lazy输出:
        • 5.43 多头注意力合并:
      • 5.5 Encoder输入输出:多个Encoder和蒸馏层的组合
        • 5.51 输入:
        • 5.52 输出:
      • 5.6 Decoder输入输出:
        • 5.61 输入:
        • 5.62 输出:
  • 四、Informer代码介绍:
  • 五、实验

一、背景:

1.时间序列介绍:

时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。

时间序列分析的主要目的是根据已有的历史数据对未来数据进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。

2.LSTF介绍:

LSTF(Long Sequence Time-Series Forecasting)即长序列时间序列预测。

它是时间序列预测问题的一种特殊场景,要求模型具有很高的预测能力,即能够有效地捕捉输出和输入之间精确的长程相关性耦合。在实际应用中,如用电量使用规划等问题中,需要对长序列时间序列进行预测。

3.Transformer与Informer的关系:

Informer和Transformer都是神经网络架构
Informer是在Transformer的基础上进行了改进和优化,旨在提高处理长序列的速度和效率。

因此学习Informer前提是掌握Transformer。故我们在本文中首先详细讲解Transformer,然后在讲解Informer时主要讲解其在Transformer上的改进。

二、Transformer:

在这里插入图片描述

论文地址:Transformer论文地址

1.Transformer简介:

目前,在NLP领域当中,主要存在三种特征处理器——CNN、RNN以及Transformer,当前Transformer的流行程度已经大过CNN和RNN,它抛弃了传统CNN和RNN神经网络,整个网络结构完全由Attention机制以及前馈神经网络组成。

BERT算法(进击的巨人)的最重要的部分便是Transformer的概念,它本质上是Transformer的编码器部分。自从Transformer使用了抛弃RNN、CNN的纯Attention机制之后,各种基于Transformer结构的预训练模型都如雨后春笋般雄起,本文中Informer便是其中一员。

2.Transformer整体架构:

在这里插入图片描述
Transformer的结构图,拆解开来,主要分为图上4个部分,接下来我将按照1,2,3,4的顺序逐步介绍上图中Transformer的网络结构,这样既能够弄清楚结构原理,又能够方便理解Transformer模型的工作流程。

3.模型输入:

3.1第一层Encoder输入:

在这里插入图片描述
第一步: 以用电量时间序列预测为例,Inputs为n个时间步长(实验中以96h为例)的用电量数据,经过Embedding后将每个小时的用电量数据升维成d维(实验中以512维为例)的向量,因此Embedding的输出是一个包含n个token的序列,每个token用一个d维(512)向量表示,可以用矩阵x表示(x的大小是d×n)
在这里插入图片描述

第二步: inputs执行embedding后需要给每个token添加位置编码positional encoding,因为时间序列的时间特征也很重要,例如用电量数据往往具有周期性(周一至周五家庭用电量少,周六至周日家庭用电量多),所以我们需要对每个token进行位置编码,生成矩阵y(y的大小是d×n)。
在这里插入图片描述

第三步: 矩阵x与y进行相加,作为Encoder的输入。

在这里插入图片描述

注:仅第一层Encoder输入同上,后续Encoder的输入不再同上,而是上一层Encoder的输出。

3.11 细节说明:
3.111 “token”解释:

在时间序列预测的上下文中,token通常指的是输入序列中的一个基本单元或元素,对于用电量时间序列数据,每个token代表一个时间步长(小时)的用电量数据。例如,如果你有一个按小时记录的用电量数据集,每个token可能就是一个小时的用电量值。

3.112 Embedding原理:

Embedding对低维数据进行升维时,会把一些特征给放大,或者把笼统的特征给分开。

原理就是矩阵乘法,其中被乘数是时间序列数据,乘数是嵌入矩阵Embedding Matrix,Embedding Matrix在训练过程中根据反向传播算法和优化器进行更新,使得时间序列数据在乘Embedding Matrix后能更好地放大其数据中的特征

因此,这个Embedding层一直在学习优化,使得整个数据升维过程慢慢形成一个良好的观察点,即Embedding Matrix。

3.113 Positional Encoding原理:

Transformer使用的是正余弦位置编码。位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致。
在这里插入图片描述

3.114 “特征”解释:

特征即数据中有用的数据信息,例如每个时间步的用电量值…

3.2 第一层Decoder输入:

在这里插入图片描述
Decoder的输入与Encoder的输出处理方法步骤是一样的,区别是Encoder输入为特征数据,而Decoder输入为标签target数据。

注意Decoder在训练阶段target为真实值,并且用到了mask机制(详见Decoder层),而在预测阶段target为空,即模型不接收target输入。

对应到上面例子里面就是:在多变量预测单变量的用电量预测中,使用图书馆、办公楼的用电量数据预测信息楼的用电量数据。

  • 模型训练阶段 Encoder输入的是图书馆、办公楼的用电量数据,Decoder输入的是执行mask机制后信息楼的用电量数据真实值(因为mask所以每层输入的真实值个数是递增的)。
  • 模型预测阶段 Encoder输入的是图书馆、办公楼的用电量数据,第一层Decoder输入为Null。Decoder每次输入是上一时刻Transformer的输出。例如,输入"“,输出"信息楼1/1用电量预测”,输入"信息楼1/1用电量预测",输出"信息楼1/1与1/2用电量预测"…
3.21 细节说明:
3.211 “标签列”解释:

在多变量预测单变量的用电量预测中,使用图书馆、办公楼的用电量数据预测信息楼的用电量数据。特征列即为图书馆、办公楼的用电量数据,标签列即为被预测的数据列,即信息楼的用电量数据。

4.Encoder:

在这里插入图片描述

4.1 Encoder组成与功能:

Encoder由多头注意力机制Multi-Head Attention和前馈神经网络Feed Forward Network组成,用于捕捉输入序列中的上下文关系和特征表示。Encoder重复堆叠N层有助于提取输入序列中的深层特征表示。

举例来说:用269栋建筑的用电量数据预测第270栋建筑的用电量数据时,Encoder部分负责计算269栋建筑用电量的相关性信息,并通过跨注意力机制将这些信息(编码矩阵)传递给Decoder。

4.2 Self-Attention:

简单来说,注意力Attention就是:输入序列较重要点获得较高的权重(更多的注意力),不重要的点获得较低权重(更少的注意力)

注意力机制函数入参:查询向量 Q、键向量 K、值向量 V通过对输入序列的线性变换(矩阵乘法)得到,其中X为Encoder输入的矩阵,X的每行为一个token,X通过乘三个权值矩阵WQ,WK,WV ,转变成为计算Attention值所需的Query,Keys,Values向量。其中矩阵WQ,WK,WV 为三个超参数,在模型训练阶段不断更新。
在这里插入图片描述
Q,K,V第n行代表的是X第n行的token的数据信息。 得到Q,K,V之后,接下来就是计算Attention值了。
在这里插入图片描述
在这里插入图片描述

  • QKT是为了计算查询矩阵Q中每个行向量q(代表之前的每个token)与键矩阵K中每个行向量k之间的相关性,获得每个查询向量q与每个键向量k之间的注意力分数。
  • 除根号√dk是归一化操作,目的是确保注意力权重的分布更加均匀、训练时梯度能够稳定,其中dk就是K的维度。
  • Softmax()回归将输入的向量转化为具有和为1的概率分布,用概率分布更好的体现查询向量q与每个键向量k之间的相关性
  • 乘值矩阵V做加权目的是得到最终的注意力,为了突出与每个查询向量q更相关的序列部分。

注意力机制的目的是:突出查询向量q与每个键向量k之间的相关性,从而强调输入序列中与该查询向量更相关的部分。

4.3 Multi-Head Attention:

单一的注意力机制能挖掘到的信息有限,通过多次自注意力计算来关注序列不同位置的子空间表示信息,同时不同的头可以关注序列的不同特征表示,从而更好地提取输入序列中的特征

self-attention只使用了一组WQ,WK,WV来进行变换得到Query,Keys,Values。而Multi-Head Attention使用多组WQ,WK,WV得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接,合并输出全局特征Z。Transformer里面是使用了8组不同的WQ,WK,WV

在这里插入图片描述

  • 每个头Head有单独的WQ,WK,WV,所有WQ,WK,WV在模型训练阶段都做为超参数不断更新。

4.4 Add残差连接:

防止在深度神经网络训练中发生退化问题,即深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再继续增加网络层数,Loss反而增大。

4.5 Norm层归一化:

能够加快训练的速度、提高训练的稳定性。归一化使得使每一行的概率和为1,归一化后的数据在进行梯度下降寻找最优参数时,更容易找到最优解。

4.6 Feed-Forward Networks:

在这里插入图片描述这里的全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。

这两层网络就是为了将输入的Z映射到更加高维的空间中,然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。
在这里插入图片描述
通过这种前馈网络的设计,Transformer 模型能够学习到输入序列中的更复杂的特征和模式, 从而提高模型的表达能力和泛化能力。

4.7 Encoder堆叠:

Feed-Forward Networks输出经过Add&Normalize,输入下一个Encoder中,经过6个Encoder后最终输出的是每个输入token对应的上下文向量表示,也称为"编码矩阵"(encoding),其中包含了每个token与其余token的关系(全局相关性)信息最后输入到decoder中

5.Decoder:

在这里插入图片描述

5.1 Decoder组成与功能:

每个Decoder有两个Multi-Head Attention层和一个Feed Forward Network组成。第一个Multi-Head Attention层采用了Masked操作。第二个Multi-Head Attention层的K、V矩阵输入源来自Encoder的输出编码矩阵,而Q矩阵是由经过Add & Norm层之后的输出计算来的。Decoder在训练过程中通过Encoder的编码矩阵和带预测值的真实值来生成预测序列,并通过损失函数和优化算法来优化模型的预测能力。这样,模型就可以学会利用编码矩阵来预测标签列。

举例来说:用269栋建筑的用电量数据预测第270栋建筑的用电量数据时,Decoder利用Encoder的编码矩阵以及第270栋建筑的真实用电量数据来生成预测序列,并通过损失函数和优化算法来优化模型的预测能力。这样,模型就可以学会利用其他建筑的用电量数据来预测第270栋建筑的用电量。

5.2 Masked Multi-Head Attention:

Masked Multi-Head Attention的功能是为了得到之前已经预测输出的真实值信息。

mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。对于一个序列,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。实现思路为:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。

这在训练的时候有效,因为训练的时候采用Teacher Forcing的训练方式,每次我们是将target真实数据 (答案) 完整输入进Decoder中的,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
在这里插入图片描述

5.3 Multi-Head Attention:

Decoder中Multi-Head Attention的功能是通过当前的输入与经过Encoder提取过的编码矩阵来预测输出。

它的输入Query来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。为了让Decoder能够利用Encoder中的信息,学习到输入序列的全局依赖关系和重要特征,从而更好地生成输出序列。

5.4 Decoder堆叠:

经过第二个Multi-Head Attention之后的Feed Forward Network与Encoder中一样,然后就是输出作为下一个Decoder的输入,如此经过6层Decoder之后到达最后的输出层。

6.模型输出:

在这里插入图片描述
首先经过一次线性变换,然后Softmax得到输出的概率分布,然后通过词典,输出概率最大对应的值作为我们的预测输出。

7.Transformer训练和预测过程总结:

用269栋建筑的用电量数据预测第270栋建筑的用电量数据为例:

  • 训练阶段:
    • Encoder部分负责计算269栋建筑用电量的相关性信息,并通过跨注意力机制将这些信息(编码矩阵)传递给Decoder。
    • Decoder利用Encoder的编码矩阵以及第270栋建筑的真实用电量数据(注意使用mask机制)来生成预测序列,并通过损失函数和优化算法来优化模型的预测能力,获取最优超参数。这样,模型就可以学会利用其他建筑的用电量数据来预测第270栋建筑的用电量。
  • 预测阶段:
    • 预测阶段所有超参数已经确定,且为已知常数值。
    • Encoder部分负责计算269栋建筑用电量的相关性信息,并通过跨注意力机制将这些信息(编码矩阵)传递给Decoder。
    • Decoder利用Encoder的编码矩阵以及模型来生成预测序列(例如模型为y=ax+b,ab为超参数已知,通过传入编码矩阵x到模型中计算第270栋建筑的预测值y),具体来说,预测值的生成不是一次完成的,而是一个一个的,首先会给Decoder输入开始标志(第一层Decoder输入为Null),然后经过Decoder会预测出第270栋建筑11/1日的用电量预测值,然后拿着第270栋建筑11/1日的用电量预测值作为Decoder输入去预测第270栋建筑11/2日的用电量预测值,但后拿着第270栋建筑11/1、11/2日的用电量预测值作为Decoder输入去预测第270栋建筑11/3日的用电量预测值,以此类推。

三、Informer:

在这里插入图片描述

论文地址:Informer论文地址PDF点击即可阅读
代码地址:论文官方代码地址点击即可跳转下载GIthub链接

1.简介:

Informer是一种专为 长序列时间序列预测(LSTF) 设计的Transformer模型。相较于传统的Transformer,Informer具备了三个独特特点。首先,他采用ProbSparse自注意力机制,具有O(LlogL)的时间复杂度和内存使用。能够有效捕获序列中的长期依赖关系。其次,通过自注意力蒸馏技术,Informer能够高效处理极长的输入序列。最后,Informer的生成式解码器可以一次性预测整个长时间序列,在预测过程中大幅提高了效率。经过大规模数据集的实验验证,Informer在LSTF问题上表现优秀,为长序列时间序列预测提供了一种高效准确的解决方案,克服了传统Transformer模型的限制。

2.传统Transformer在时序预测方面缺点和Informer改进方法:

Transformer的缺点Informer的改进
self-attention平方级的计算复杂度提出ProbSparse Self-attention筛选出最重要的Q,降低计算复杂度
堆叠多层网络,内存占用瓶颈提出Self-attention Distilling进行下采样操作,减少维度和网络参数的数量
step-by-step解码预测,速度较慢提出Generative Style Decoder,一步可以得到所有预测的

3.Informer整体架构:

在这里插入图片描述

4.Informer优化详解:

4.1 ProbSparse Self-attention:

在这里插入图片描述
通过以上图可以看到,并不是每个q与k之间都具有很高的相关性(内积),即不是所有q都具有很高的活跃度,我们不需要花很多时间在处理这些弱活跃度的q上,因为这些q提取不出数据间的相关性和好的特征。这就是该算法改进的突破口。

改进算法如下:
(1)输入序列长度为96,首先在K中进行采样,随机选取25个k
(2)计算每个q与25个k的内积,现在一个q一共有25个得分。
(3)每个q在25个得分中,选取最高分的与均值算差异
(4)这样我们输入的96个q都有对应的差异得分,我们将差异从大到小排列,选出差异前25大的q
(5)其他淘汰掉的q使用V向量的平均来代替

4.2 Self-attention Distilling:

在这里插入图片描述
在相邻的Attention Block之间加入卷积池化操作,来对特征进行降采样。对输入维度进行修剪,堆叠n层,每层输入序列长度减半,从而将空间复杂度降低到O(nlogn)

4.3 Generative Style Decoder:

在这里插入图片描述
源码中的decoder输入长度为72,其中前48是真实值,后24是预测值。我们可以理解为一段有效的标签值(48个真实值)带着一群预测值(24个待预测值)进行学习,这种方法可以一步到位生成目标序列,不需要再使用动态解码。

4.4 Positional Encoding:

在这里插入图片描述
Informer在Transformer位置编码(Local Time Stamp)的基础上,加入了Global Time Stamp,可以更好的提取输入序列中的时间特征。

Encoder输入改进如下:

  • Scalar:Embedding升维
  • Local Time Stamp:位置编码
  • Global Time Stamp:提取时间特征

5.模型输入输出角度理解Informer训练和预测过程:

数据集:BDG2
(小时维度的数据) 数据规格:17420 * 320
Batch_size:32

5.1 Encoder Embedding输入:

在这里插入图片描述
Xenc = 32 × 96 × 320

  • 32为batch大小,一个batch有32个样本,一个样本代表96个时间点的数据。
  • 320为每个数据的维度,表示每个时间点数据(每行)有320列。

Xmark = 32 × 96 × 4

  • 32 × 96同上,表示每个时间点的数据都要有一个位置编码,Xmark与Xenc每行一一对应。
  • 4为时间戳,例如我们用小时维度的数据,那么4分别代表年、月、日、小时,

5.2 Decoder Embedding输入:

在这里插入图片描述
Xdec = 32 × 72 × 320
Xmark = 32 × 72 × 4

  • 72=48+24,其中48为Encoder96的后48个时间点数据,用这些真实值来带一带预测值,24为待预测值。
  • 48为绿色部分,24为白色部分填充0(mask机制)

5.3 Embedding输入输出:

将维度为320/7的一个时间点的数据投影成维度为512的数据。

5.31 输入:

32 × 96/72 × 320
32 × 96/72 × 4

5.32 输出:

32 × 96/72 × 512

5.4 ProbSparse Self-attention输入输出:

5.41 输入:

32 × 8 × 96 × 64 (8 × 64 = 512,这也是多头的原理,即8个头)

5.42 Active输出:

32 × 8 × 25 × 64 (只取25个活跃q)

5.43 Active+Lazy输出:

32 × 8 × 96 × 64 (除了25个活跃q,其余q用V向量的平均来代替)

5.43 多头注意力合并:

32 × 96 × 512

5.5 Encoder输入输出:多个Encoder和蒸馏层的组合

5.51 输入:

32 × 96 × 512(来自上面embedding 长度为96的部分)

5.52 输出:

32 × 51 × 512(这里的51应该是conv1d卷积取整导致的,因为源码要自行调整,所以是这样的)

5.6 Decoder输入输出:

5.61 输入:

32 × 51 × 512 & 32 × 72 × 512(32 × 51 × 512是Encoder输出,32 × 72 × 512是Decoder Embedding后的输入)

5.62 输出:

32 × 72 × 512

四、Informer代码介绍:

五、实验

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

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

相关文章

SSRF靶场实战

SSRF(curl) SSRF(file_get_content)

源代码管理——码云Gitee

目录 Git安装 Gitee配置SSH 源代码管理常规操作 1.idea配置git 2.常规操作 Git安装 安装Git是进行源代码管理的基本步骤之一。以下是在本地安装Git的通用步骤,适用于Windows系统: 下载Git安装程序: 访问Git官网的下载页面:Git官网下载地…

day16_ListSet课后练习题 - 参考答案

文章目录 day16_课后练习题第1题第2题第3题第4题第5题第6题第7题第8题 day16_课后练习题 第1题 案例: ​ 1、用一个String[]数组存点数 ​ 2、用一个String[]数组存花色 ​ 3、用一个String[]数组存大王、小王 ​ 4、用上面的数组,生成一副扑克牌 …

keepalived+HAProxy+MySQL双主实验

keepalivedHAProxyMySQL双主实验 环境准备 node1(HAProxy1):192.168.184.10 node2(HAProxy2):192.168.184.20 node3(MySQL1):192.168.184.30 node4(MySQL2):192.168.184.40 虚拟IP vip:192.168.184.100MySQL部署 在node3执行以下脚本: #!/bin/bash sy…

智能枪弹柜管理系统-智能枪弹管理系统DW-S306

随着社会的发展和治安形势的日益严峻,对于枪弹的管理变得尤为重要。传统的手工记录和存放方式已经无法满足现代化、高效化、安全化的需求。因此,智能枪弹柜管理系统应运而 生。 在建设万兆主干、千兆终端的监控专网的基础上,弹药库安全技术…

Web性能优化-详细讲解与实用方法-MDN文档学习笔记

Web性能优化 查看更多学习笔记:GitHub:LoveEmiliaForever MDN中文官网 性能优良的网站能够提高访问者留存和用户满意度,减少客户端和服务器之间传输的数据量可降低各方的成本 不同的业务目标和用户需求需要不同的性能度量,要提高…

LangChain Agent v0.2.0简明教程 (上)

快速入门指南 – LangChain中文网 langchain源码剖析系列课程 九天玩转Langchain! 1. LangChain是什么2. LangChain Expression Language (LCEL)Runnable 接口3. Model I/O3.1 Prompt Templates3.2 Language Model3.3 Output ParsersUse case(Q&A with RAG)1. LangChain…

我的128创作纪念日

目录 学习成长机遇个人数据一览榜单认可日常2024憧憬和规划创作纪念日总结 学习成长机遇 账号创建已经快9年了,以前一直在个人网站和简书上写文章,在CSDN真正写文竟然在2023年10月20,至今才128天,不过获得的数据还算可以&#xff…

力扣细节题:翻转二叉树

细节一:递归采用前序递归 细节二:采用交换节点而不是交换数据因为左右树交换的同时左右树的所有子节点都要交换 细节三:采用外置函数因为return如果在本函数内操作会存在必须返回空指针的问题 /*** Definition for a binary tree node.* s…

【MySQL面试复习】什么是聚簇索引(聚集索引)和非聚簇索引(二级索引)/什么是回表?

系列文章目录 在MySQL中,如何定位慢查询? 发现了某个SQL语句执行很慢,如何进行分析? 了解过索引吗?(索引的底层原理)/B 树和B树的区别是什么? 系列文章目录什么是聚簇索引(聚集索引&#xff09…

堆排序、快速排序和归并排序

堆排序、快速排序和归并排序是所有排序中最重要的三个排序,也是难度最大的三个排序;所以本文单独拿这三个排序来讲解 目录 一、堆排序 1.建堆 2.堆排序 二、快速排序 1.思想解析 2.Hoare版找基准 3.挖坑法找基准 4.快速排序的优化 5.快速排序非…

程序媛的mac修炼手册-- 2024如何彻底卸载Python

啊,前段时间因为想尝试chatgpt的API,需要先创建一个python虚拟环境来安装OpenAI Python library. 结果,不出意外的出意外了,安装好OpenAI Python library后,因为身份认证问题,根本就没有获取API key的权限…

opencv基础 python与c++

question: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib Opencv 一、读取图片 (1).imshow Mat imread(const string& filename, intflags1 );flags: enum { /* 8bit, color or not */CV_LOAD_IMAGE_UNCHANGED -1, /* 8bit, gray */CV_LOAD_I…

红队攻防之powershell上线基础免杀(一)

不努力,你背井离乡干嘛?当卧底啊 环境为win10,在哥斯拉生成的webshell下,执行powershell命令。 测试杀毒软件为:火绒,腾讯电脑管家 哥斯拉生成php文件的webshell 如图 哥斯拉进行连接 把要执行命令的文件…

20.scala视图界定

目录 概述实践代码执行 结束 概述 scala 中的视图界定 实践 代码 /*** 视图界定*/ object Genericity03 {def main(args: Array[String]): Unit {println(new MaxInt(1,2).compare)println(new MaxLong(1L,2L).compare)// 不行 // println(new MaxValue(1,2).compare)// …

AD24-PCB尺寸标注、LOGO添加、装配图即多层线路PC输出

一、PCB尺寸标注 1、切换到机械层 2、按shifee进行捕捉切换 按TAB键或空格键进行横向和纵向标注切换 二、LOGO添加 1、放置-图形 2、在空白位置线绘制一个框 3、进行大小调整 三、装配图输出 1、 导出原材料BOM表,不要勾选 顶层 底层 颜色设置 2、输出只有Value值…

NGINX服务器配置实现加密的WebSocket连接WSS协议

一、背景 最近在做小程序开发,需要在nginx中配置websocket加密模式,即wss。初次配置wss时,踩了两个小时的坑,本文将踩坑过程分享给大家,有需要用到的伙伴可以直接copy即可实现,节省宝贵时间。 二、WebSo…

Redis可以让数据不丢失吗

Redis作为一款备受青睐的开源内存数据存储系统,拥有诸多引人注目的主要特点,为各种应用场景提供了高性能、灵活多用途的解决方案。本文将详细介绍Redis的主要特点,并探讨其在现代应用开发中的重要作用。 首先,Redis以其卓越的性能…

高等数学(函数)

目录 一、函数的定义 二、几种函数 2.1 分段函数 2.2 反函数 2.3 显函数与隐函数 显函数 隐函数 三、几种特性 3.1 奇偶性 偶函数 奇函数 3.2 周期性 3.3 单调性 一、函数的定义 其中x是自变量,y是因变量。 二、几种函数 2.1 分段函数 2.2 反函数 ——…

Qt MDI应用方法:QMdiArea和QMdiSubWindows类

重点: 1.使用MDI应用程序,需要在主窗口的工作区放置一个QMdiArea组件。 并将QMdiArea组件设置成中心窗口 2.MDI有两个显示模式:Tab多页显示模式和子窗口显示模式 子窗口显示模式有两种显示方法:窗口级联展开和平铺展开 窗口级联…