干货 | 深度多元时序模型在携程关键指标预测场景下的探索应用

news2024/12/25 13:16:56

作者简介

doublering,携程高级算法工程师,关注自然语言处理、LLMs、时序预测等领域。

一、背景

互联网行业中,有许多关键指标直接影响公司未来的规划与决策,比如流量、订单量、销售额等。有效地预测这些关键指标能够辅助公司提前做出相应的预算、规划、决策,实现收益的最大化。

预测关键指标实际上是个典型的时间序列预测问题,即基于指标的历史真实数据来预测未来一段时间的值。在携程也有一些相关的业务场景,本文将以预测流量、订单量、GMV为例,介绍我们在时间序列预测方面使用的一些方法与思考。

二、问题定义与难点

2.1 口径定义

预测目标值:流量、订单量和GMV等关键指标。

预测时长:未来30天。

重点关注节假日期间的预测,包括清明节、劳动节等法定节假日以及法定节假日的前后一段时间,要求在法定节假日的提前一段时间进行预报,为业务在关键时间节点的投放提供参考。

2.2 难点

在现实场景中,时间序列预测会受到宏观政策、自然灾害、社会运动等多种因素的影响,而且这些因素难以量化,这集中表现为时序数据中的突变点和非周期性。再者,时序数据的周期通常以天为单位,一些历史较短领域的训练样本会不足。同时,时序模型需要支持多个特征辅助预测,如节假日特征、时间类特征以及各种协变量等。为了更早地布局,需要进行长时预测,即预测未来一个月、半年、一年的值。

三、方案设计

3.1 数据选择与特征构建

选取近几年的关键指标的时序数据,时间粒度为“天”。我们画出各项指标的历史数据,可以看到明显的节假日效应,每个尖峰都对应着法定节假日或者寒暑假期间,数值的涨跌对应着工作日与非工作日等。

由此,我们依据时序顺序追溯构造7个假期/时间型特征,分别为:预测日是否为假期、预测日是否为工作日、预测日在假期中是第几天、预测日距离下一次假期的天数、预测日是周几(周日为1)、预测日所处星期在一年中是第几周、预测日所处的季节等。

446658d63320f7ba159157395eae4efa.png

同时,注意到各项指标之间的总体趋势是有关联的,当预测其中一项指标时,其他指标也可作为特征入模,以提高预测的准确性,因此总共构建了20个左右的特征。

3.2 模型介绍

通常来说,时间序列预测模型大致可分为三类:一是传统时间序列预测模型,比如移动平均、ARIMA、指数平滑法等,二是机器学习模型,比如线性回归、树模型、Prophet等,三是深度学习模型,比如时序卷积网络(TCN)、LSTM、Transformer等。

目前工业实践上,采用传统时间序列预测模型进行预估较为普遍。传统时间序列预测模型具有可解释性、简单直观、理论成熟等优点,但其通常只能以单变量的方式进行预测,而我们的任务涉及多个关键指标的预估,有多个特征会影响这些指标,而且这些指标之间也互有影响。除此之外,传统时间序列预测模型处理多步预测时,往往采用滚动预测的策略,即使用前一期预测值作为实际值加入模型,从而得到下一期的预测,这种策略会导致预测误差累计,从而使得多步预测的精准性越来越差。

机器学习方法可以利用多变量进行预测,学习到时间序列数据中的复杂模式和趋势,但是其需要针对每一个指标训练一个模型,并且涉及到多步预测时,也会存在误差累积的缺点。

近年来,基于深度学习的方法也被广泛地应用于时序预测任务中,例如时序卷积网络(TCN)、LSTM、Transformer等。这些方法克服了上述缺点,具有支持输入多个变量,自适应地提取特征,执行多步预测,一次性输出多个指标的预测值等优势。因此,本文的实战部分利用的是深度学习方法。下面简要介绍实践中涉及到的几种模型或方法。

3.2.1 Prophet

Prophet是Facebook开发的时间序列预测模型,具有简单易用、运行效率高、可解释性强等优点。Prophet是将时间序列看成是一个关于t的函数,并将时间序列分解为趋势项、季节项和节假日项等,有加法模型和乘法模型两种模式,加法模型的核心公式如下:

y(t)=g(t)+s(t)+h(t)+ϵt

其中,g(t)代表趋势项,s(t)代表季节项,h(t)代表节假日项(或者泛指外部变量), ϵt代表噪声项。

趋势项用于拟合时间序列非周期性的趋势变化,例如:上升、下降趋势。按照趋势模式,可分为线性趋势和非线性趋势,线性趋势的公式为:

g(t)=kt+m

非线性趋势的公式为:

01c281589c4b7a2ffde5da0fec093de0.png

其中,C表示上限容量,即g(t)所能达到的上界;k表示增长率;m表示偏移参数,趋势项斜率发生变化的转折点。调整m可以对曲线进行左右平移。在具体的实现中,C和k都是时间t的函数,且k的变化是不连续的,为了使g(t)连续会引入一系列复杂的变换,在此不赘述。

季节项用于拟合周、月、季等的周期性变化趋势,使用傅里叶级数来逼近:

a751217ff27c0cdb647a66c9883f9033.png

0641414260cad9df798fcdcc14d4e718.png

则,s(t)=X(t)β,β是需要学习的03d88703ad222956503e4ad9ec40e4db.png,服从正态分布N(0,σ²)。

其中,P表示周期(年用365.25,周用7),N表示使用的逼近项数目(年用10,周用3)。

节假日项用于表示潜在的跳变点对预测的影响,例如:节假日、突发事件等。由于每个节假日对时间序列的影响程度不一样,因此,不同的节假日可以看成相互独立的模型。并且可以为不同的节假日设置不同的前后窗口值,表示该节假日会影响前后一段时间的时间序列。假设现在有L种不同的节假日,Di表示节假日窗口的日期集合,节假日项可表示为:

Z(t)=[1(t∈D1,…,1(t∈DL)]

h(t)=Z(t)κ

其中,κ同样服从正态分布N(0,ν²),ν叫做holidays_prior_scale,默认值是10,当值越大时,表示节假日对模型的影响越大;当值越小时,表示节假日对模型的效果越小。

最后,噪声项用于表示未预测到的随机波动。

根据以上介绍,Prophet模型其实是在训练:趋势项里的k,m;季节项里的β;节假日项里的κ;以及误差项ϵt。Prophet模型适用于预测符合以下条件的时间序列数据:

  • 训练数据:拥有至少一个完整周期的数据,让模型完整学习规律;

  • 数据趋势:数据有一定正常的周期效应,例如:周末效应、季节效应等;

  • 跳变情况:明确可能发生跳变的时间点及窗口期,例如:双十一、春节等;

  • 缺失值情况:历史数据的缺失值和异常值保持在合理范围内。

3.2.2 Informer

Informer是一种基于Transformer架构的时间序列预测模型。Transformer由自注意力机制的编码器和解码器组成。Informer的设计目标是解决传统的时间序列预测模型在长序列和多尺度预测上的挑战,以便模型能够更好地捕捉序列中的长期依赖关系和全局上下文信息。

Informer的关键特点包括:

  • 一种稀疏自注意力机制,在时间复杂度和内存使用方面达到O(LlnL)。

  • 自注意力蒸馏机制,通过对每个自注意力层结果上进行一维卷积,再通过一个最大池化层,对每层输出减半来突出主导注意力,并有效地处理过长的输入序列。

  • 并行生成式解码器机制,对长时间序列进行一次前向计算输出所有预测结果而不是逐步的方式进行预测,这大大提高了长序列预测的推理速度。

0ef9b50588b1f7b60fcdc7892fceb641.png

Informer在时间序列预测任务中取得了很好的性能,尤其在长序列和多尺度预测上表现出色。它已经被广泛应用于气象预测、交通流量预测、金融市场预测等领域。论文中提到模型在ETT(变压器温度)、ECL(电力消耗)、Weather(天气)等标准数据集上达到SOTA。

3.2.3 Autoformer

之前基于Transformer的时间序列预测模型Informer,通过自注意力机制来捕捉时刻间的依赖,在时序预测上取得了一些进展。但是在长期序列预测中,仍存在不足:

  • 长序列中的复杂时间模式使得注意力机制难以发现可靠的时序依赖。

  • Informer不得不使用稀疏形式的注意力机制来应对二次复杂度的问题,但造成了信息利用的瓶颈。

为突破上述问题,作者提出了名为Autoformer的模型,主要包含以下创新:

  • 突破将序列分解作为预处理的传统方法,提出深度分解架构(Decomposition Architecture),能够从复杂时间模式中分解出可预测性更强的组分。

  • 基于随机过程理论,提出自相关机制(Auto-Correlation Mechanism),代替点向连接的注意力机制,实现序列级连接和O(LlnL)复杂度,打破信息利用瓶颈。

764a6f96f199dd57902923eea6a8ed6b.png

时间序列分解是指将时间序列分解为几个组分,每个组分表示一类潜在的时间模式,如周期项,趋势项。由于预测问题中未来的不可知性,通常先对过去序列进行分解,再分别预测。但这会造成预测结果受限于分解效果,并且忽视了未来各个组分之间的相互作用。作者提出深度分解层,将序列分解作为Autoformer的一个内部单元,嵌入到编码器-解码器中。在预测过程中,模型交替进行预测结果优化和序列分解,即从隐变量中逐步分离趋势项与周期项,实现渐进式分解。

序列分解单元基于滑动平均思想,平滑周期项、突出趋势项:

Xt= AvgPool(Padding(χ))

XS=X-Xt

其中,χ为待分解的隐变量,Xt,XS分别为趋势项和周期项,将上述公式记为:Xt,XS=SeriesDecomp(χ)。

此外,Autoformer通过自相关机制来实现高效的序列级连接,从而扩展信息效用。观察到,不同周期的相似相位之间通常表现出相似的子过程,作者利用这种序列固有的周期性来设计自相关机制,包含基于周期的依赖发现和时延信息聚合。

最终,作者表示在长期预测问题中,Autoformer在能源、交通、经济、气象、疾病五大时序领域大幅超越之前SOTA,实现38%的相对效果提升。

3.2.4 DLinear

DLinear的作者尝试质疑基于Transformer的模型进行时间序列预测的有效性。作者认为基于Transformer的模型忽略了有序的连续点之间的时间关系,时序上的位置信息在时序预测中时十分重要的,因此提出DLinear模型。

实际上,DLinear的结构非常简单,仅仅是在Autoformer 的分解层后面加上全连接层。模型使用分解层将输入时间序列分解为残差部分(季节性)和趋势部分。随后每个部分都被输入到各自的线性层,输出各自的结果。最终的输出就是两部分输出的和。作者表示DLinear在能源、交通、经济、气象、疾病等领域的数据集上超越了其他深度学习模型。

d4134b93c541470465f6f15e43f1d4f7.png

3.2.5 TimesNet

现实世界的时序数据往往是多种过程叠加,如交通数据的日变化和周变化,天气数据的日变化和年变化等。这种内在的多周期属性使得时序变化极其复杂。

对于某一特定周期过程,其内部每个时间点的时序变化不仅仅与临近时刻有关,也与邻近周期高度相关,即呈现周期内与周期间两种时序变化。其中周期内变化对应着一个周期内的短期过程,周期间变化则可以反应连续周期间的长期趋势。

TimesNet尝试从一个全新的多周期视角分析时序变化。一维时间序列通过快速傅里叶变换选取多个周期,基于多个周期对一维数据进行折叠,得到多个二维张量,每个二维张量的列和行分别反应了周期内与周期间的时序变化。通过这种方式将一维时序数据扩展至二维空间进行分析。

TimesNet由堆叠的若干个TimesBlock组成,每个TimesBlock都有时序数据升维、2D卷积提取表征、中间结果降维、自适应融合等步骤。输入序列X首先经过嵌入层得到深度特征97ea459bea127ad37069761a45183e9f.png。对于第l层时间块,输入为c00392c32f825b03183b559affc516b5.png,经过时间块内部的处理得到输出:fe27cb4755a09333efdede35acb29f3d.png,注意到每一层时间块之间都进行了残差连接。

时间块的内部的处理过程:

1)时序数据升维

首先通过快速傅里叶变换对输入的一维时序特征2b2f0c24819d18aec935d32e801ca5a4.png提取周期,选取强度最大的k个频率{f1,…,fk},他们对应着最显著的k个周期{p1,…,pk},然后将其转化成二维张量。相关公式如下:

48103823b22aac7624177f1d61cd304e.png

其中,78db1724da2668ee16c529d5c285df45.png代表每个频率分量的强度,Period代表快速傅里叶变换以及选取topk个频率和周期的过程。Reshape代表降一维结果转换成二维张量的过程,Padding表示在卷积过程中的补零操作。

2)2D卷积提取表征

对于每个频率分量的二维张量52e877ffd27a1e822880d12448ca7bdd.png,使用2D卷积提取信息,此处使用Inception模型:

d71444937ad928aea056f1280ce551b3.png

3)中间结果降维

将二维特征转换至一维空间,继续进行信息聚合: 

d5a6a9a304ca7f6b90343c063808dc2c.png

其中,Trunc表示将步骤1)中Padding操作补充的零去除。

4)自适应融合

将上一步中得到的一维表征6dca2f9df0e24d5c041501a16c3c5a1d.png,与其对应的频率强度进行加权求和,得到一个时间块的最终输出。

e49cbd1e8c43cbc9037ccbc386cf33ba.png

通过时间块的设计,模型完成了从多个周期分别提取二维时序变化,再进行自适应融合的时序建模过程。各个时间块之间进行残差连接,便于梯度的直接回传,可加速模型收敛、避免梯度消失。

最终TimesNet在能源、交通、经济、气象、疾病等领域的数据集上达到最佳。

34b3a3684bfaad71f26dd5503cb3dd33.png

5c899874ccc8c96801f5109c87d82c2a.png

以上就是我们用于比较预测效果的模型,由于本文侧重实践,如果想要更深入地了解各个模型的具体细节,可以自行阅读原论文,论文链接在参考文献中给出。

四、实战

4.1 数据预处理

经过分析,自然状态下的某频道的流量、订单量等指标具有明显的周期性和趋势性,但这种周期性和趋势性在疫情期间无法有效体现,如图红框所示,在疫情期间各项指标的时序数值,较之疫情前后没有明显的周期性和趋势性,受疫情政策的影响较大。而经过22年底至23年初国内对疫情的快速过峰,23年的各项指标序列基本恢复了疫情前的周期性和趋势性,我们的目标是预测23年恢复自然状态之后的指标,因此考虑剔除疫情期间(2020/01/20~2023/01/19)的数据。

4f72be75a75b029b79b192a488019262.png

以某频道流量为例,画出去除疫情数据后的走势图,红线是以年为尺度进行分割,可以看出数据具有显著的年周期性。

c54f2a82147c7e06c3a25cf2de833d7d.png

4.2 模型训练与评估

以各项指标的历史数据和其他特征作为数据集,利用3.2中介绍的模型进行预测(Prophet模型只接受单输入,故不作统一比较)。下面以某频道流量为例进行介绍。数据经过脱敏处理。

经测试:Informer的效果在绝大部分情况下均不及Autoformer,因此后续的对比在Autoformer、DLinear和TimesNet中进行。

首先定义输入数据的几个参数:

  • model_in:模型的输入维度,设定为20;

  • model_out:模型的输出维度,设定为20;

  • seq_len:训练模型时编码器时间窗口的大小,可理解为模型回看的时间周期;

  • label_len:训练模型时解码器时间窗口的大小,label_len不要超过seq_len,一般设置为seq_len的一半;

  • pred_len:预测窗口的大小,即对未来预测多少个时间步,本文中pred_len等于30。

评价指标:MSE(均方误差)和MAE(平均绝对误差)。

* Autoformer                                

5c558c6d1d54838fa44f341ad7ca5fc0.png

* DLinear

d89b265e92e244c9e7c3a6d652cf86b8.png

* TimesNet

77cd735d2cbe595cfbafe8c983162f89.png

我们分别对不同的seq_len和label_len组合进行了对比实验,测试集的结果显示,当seq_len=180、label_len=90时,预测的结果最好。模型之间的横向对比显示,TimesNet的效果最好。

此外,针对可能发生的突变点,我们进行了T=120的预测,结果如下:

636184d654c3ee3ee1c0c4827abc6d0d.png

图像表明,TimesNet模型也无法捕捉到突变点的变化,这可能是训练数据太少导致的。为了能够捕捉到突变点,通过集成Prophet等对突变点较为敏感的传统模型,结果表明集成模型在保证预测精度的同时,还能较好地捕获突变点的变化,且MSE和MAE均小于原模型,如下图所示。

值得一提的是,以上方法的输入输出的维度是可以自己定义的,即可以单输入单输出、多输入单输出、多输入多输出等。

15373cf07cdf8fc8bc9ed24d069bc326.png

4.3 模型部署与回测

在离线训练模型完毕之后,我们将模型部署到了线上,每天更新T+30D的结果,流程如图所示:

0e40539d4a9dddd9e6418349eaa76aea.png

模型上线后需要一定的监控机制,以便在模型预测的效果不好的时候及时修正模型。我们持续监控预测值和真实值的T+3D、T+7D、T+14D、T+21D、T+30D偏差,并以报表的形式展现。

15a3fb3a61210ab3e7e84043258e7829.png

以某频道为例,我们应用模型预测五一节假日某频道的流量,平均预测偏差率为+1.03%,峰值预测偏差率为+0.43%,模型达到了非常优秀的效果。另外,选取五一假期的结束日期作为截止点,3天、7天、14天、21天、30天的平均预测偏差率分别为:+3.7%、+1.8%、+1.4%、+5.5%、-9.6%。

37681c1b29f9a237eee31072f8dc919a.png

18e75912760cf883fabea3ef66c3683c.png

五、总结与展望

本文从预测关键指标的任务出发,论述了时序预测的相关方法、模型的训练与评估、以及模型的在线部署与回测,其中部分内容做了简化处理。

总体而言,近几年来基于深度学习的时序预测的方法是在蓬勃发展的。但是,深度学习的方法很大程度上依赖于数据量,训练数据越多,模型就更的容易从中发现时序潜在的模式。而在现实场景中,数据量并不总是充足的,因此会影响深度学习模型的效果,有时甚至不如传统的方法。另一方面,由于时序数据本身带有公式化的数学特性,深度学习方法能否提供形式化的表征也是一种未知数。

不过,随着时间的发展,数据是会越来越多的,同时,目前越来越多的研究将传统的时序预测方法融合进深度学习时序预测模型中,这也是将数学特性融入深度学习方法的一种尝试。

在今后我们还将继续对基于深度学习的时序模型进行优化,如构造更多特征和协变量、增加预测置信区间、完善模型的评判标准等。

六、参考文献

[1] Taylor S J, Letham B. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45.

[2] Zhou H, Zhang S, Peng J, et al. Informer: Beyond efficient transformer for long sequence time-series forecasting[C]//Proceedings of the AAAI conference on artificial intelligence. 2021, 35(12): 11106-11115.

[3] Wu H, Xu J, Wang J, et al. Autoformer: Decomposition transformers with auto-correlation for long-term series forecasting[J]. Advances in Neural Information Processing Systems, 2021, 34: 22419-22430.

[4] Zeng A, Chen M, Zhang L, et al. Are transformers effective for time series forecasting?[C]//Proceedings of the AAAI conference on artificial intelligence. 2023, 37(9): 11121-11128.

[5] Wu H, Hu T, Liu Y, et al. Timesnet: Temporal 2d-variation modeling for general time series analysis[J]. arXiv preprint arXiv:2210.02186, 2022.

[6] https://zhuanlan.zhihu.com/p/421710621

【阅读推荐】

  • 携程火车票异常检测和根因定位实践

  • 携程火车票短信召回算法优化实践

  • 基于CNN的新词发现算法

  • 携程商旅基于图网络的注册风控实践

479bfd97e03bc17e09b9d74557491561.jpeg

 “携程技术”公众号

  分享,交流,成长

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

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

相关文章

C++类模板再学习

之前已经学习了C类模板;类模板的写法和一般类的写法有很大的差别;不容易熟悉;下面再做一遍; 做一个椭圆类,成员有长轴长度和短轴长度; // ellipse.h: interface for the ellipse class. // //#if !define…

Android开发知识

文章目录 HTTPHTTP到底是什么HTTP的工作方式URL ->HTTP报文List itemHTTP的工作方式请求报文格式:Request响应报文格式:ResponseHTTP的请求方法状态码HeaderHostContent-TypeContent-LengthTransfer: chunked (分块传输编码 ChunkedTransfer Encoding…

双向链表的初始化、插入、删除

双向链表的初始化 双向链表的插入 双向链表的删除 我们可以看看这一题循环双向链表的题目 王道p40 17.设计一个算法用于判断带头结点的循环双链表是否对称(c语言代码实现)_认真敲代码的小火龙的博客-CSDN博客https://blog.csdn.net/m0_46702681/article…

Shiro整合EhCache

缓存工具EhCache EhCache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。可以和大部分Java项目无缝整合,例如:Hibernate中的缓存就是基于EhCache实现的。EhCache支持内存和磁盘存储,默认存储在内存中&#xff…

netcore webapi action 同时支持 get 和 post 请求

最近在项目开发过程中,有个别接口需要同时支持GET和POST请求,经过一番测试,貌似NetCore只能接收指定的FromBody、FromQuery等参数,经过一番查找后发现文章:为ASP.NET Core实现一个自适应ModelBinder,让Acti…

HackTheBox-Starting Point--Tier 1---Sequel

文章目录 一 题目二 实验过程 一 题目 Tags Vulnerability Assessment、Databases、MySQL、SQL、Reconnaissance、Weak Credentials译文:漏洞评估、数据库、MYSQL、SQL、侦察、凭证薄弱Connect To attack the target machine, you must be on the same network.C…

QT 中 Graphics View 程序例子-Diagram Scene Example

一、 概况 本例演示如何使用图形视图框架。 “图表场景”示例是一个应用程序,您可以在其中创建流程图。可以添加流程图形状和文本,并通过箭头连接形状,如上图所示。形状、箭头和文本可以赋予不同的颜色,并且可以更改文本的字体、…

HackTheBox-Starting Point--Tier 1---Crocodile

文章目录 一 题目二 实验过程 一 题目 Tags Web、Network、Custom Applications、Protocols、Apache、FTP、Reconnaissance、Web Site Structure Discovery、Clear Text Credentials、Anonymous/Guest Access译文:Web、网络、定制应用程序、协议、Apache、FTP、侦…

C++项目——云备份-③-实用工具类设计与实现

文章目录 专栏导读1.文件实用工具类的设计2.文件实用工具类的实现2.1前置知识补充2.1.1struct stat 与 stat介绍2.1.2std::experimental::filesystem认识 2.2FileUtil实现 3.JSON实用工具类的设计4.JSON实用工具类的实现5.实用工具类整理 专栏导读 🌸作者简介&#…

ESP32智能小车+PS2无线遥控器+麦克纳姆轮+microPython

from machine import Pin,PWM from ps2 import PS2Controller import time import os# ############################################# # PS2 遥控器 # ############################################# ps2ctl PS2Controller(di_pin_no26, do_pin_no27, cs_pin_no14, clk_pin…

Unity中Shader的模型网格阴影

文章目录 前言一、网格阴影原理1、在世界空间下,把角色模型在Y轴上压缩成一个面片,把颜色修改成像影子的颜色2、把压缩后的面片,移动到合适的位置,把模型和阴影面片错开3、实现距离脚近的阴影偏移少,距离脚远的阴影偏移…

【已解决】AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘

问题 使用cv2.bgsegm.createBackgroundSubtractorMOG()去除背景的时候,遇到如下问题: AttributeError: module cv2 has no attribute bgsegm原因 报错原因:使用的python环境中没有安装扩展包contrib 解决方法 可以通过pip或者conda安装 …

QT中文乱码解决方案与乱码的原因

相信大家应该都遇到过中文乱码的问题,有时候改一改中文就不乱码了,但是有时候用同样的方式还是乱码,那么这个乱码到底是什么原因,又该如何彻底解决呢? 总结 先总结一下: Qt5中,将QString()的构…

Java实现Csv文件导入导出

Java实现Csv文件导入导出 什么是.csv文件? CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格…

基于蜣螂优化算法DBO优化的VMD-KELM光伏发电短期功率预测MATLAB代码

微❤关注“电气仔推送”获得资料(专享优惠) VMD适用于处理非线性和非平稳信号,例如振动信号、生物信号、地震信号、图像信号等。它在信号处理、振动分析、图像处理等领域有广泛的应用,特别是在提取信号中的隐含信息和去除噪声方面…

字符串中的strcpy和strncpy区别

strcpy:函数原型是char *strcpy(char* dest, const char *src),含义是将src中的字符串复制到dest中。 strncpy:函数原型是char *strncpy(char *dest const char *src,int n),表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所…

香港施政报告人才引进政策2023全面解读,对优才计划申请是否有影响?

香港施政报告人才引进政策2023全面解读,对优才计划申请是否有影响? 香港第二份施政报告10月25日出来了!这次真的是“走进民生”啊,什么路都帮你想好了! 总结就是:继续抢人才、留人才!在昨天的《…

103.linux5.15.198 编译 firefly-rk3399(2)

1. 平台: rk3399 firefly 2g16g 2. 内核:linux5.15.136 (从内核镜像网站下载) 3. 交叉编译工具 gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 4. 宿主机:ubuntu18.04 5. 需要的素材和资料&#xff…

MySQL 单表查询 多表设计

目录 数据库操作-DQL(单表查询)语法基本查询(不带任何条件)条件查询(where)聚合函数分组查询(group by [having])(重点)排序查询(order by)(重点&…

MySQL数据库基本操作2

文章目录 主要内容一.DQL1.语法格式代码如下(示例): 2.数据准备代码如下(示例): 3.简单查询代码如下(示例): 4.运算符5.运算符操作-算术运算符代码如下(示例): 6.运算符操作-条件查询…