【python量化】大幅提升预测性能,将NSTransformer用于股价预测

news2024/9/25 17:12:18

5fabdfaf1af379741eb97968b0826b2b.png

写在前面

NSTransformer模型来自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是为了解决其他方法出现过平稳化处理的问题。其通过提出序列平稳化以及去平稳化注意力机制可以使得模型面向提升预测性能的角度进行平稳化处理,相比于Transformer的变体,NSTransformer在预测性能方面实现了大幅度的提升。下面的这篇文章主要带大家了解一下NSTransformer的基本原理,并使用作者开源的NSTransformer代码,并将其用于股票价格预测当中。

1

NSTransformer模型

由于Transformer的全局范围的建模能力,使其在时间序列预测中显示出巨大的力量。然而,在联合分布随时间变化的非稳态真实世界数据上,它们的性能可能会退化得很可怕。以前的研究主要采用平稳化技术来削弱原始序列的非平稳特性,以提高预测能力。但是,被剥夺了内在非平稳性的平稳序列对于现实世界中的突发事件预测的指导意义不大。这个问题,在本文中被称为过平稳化(over-stationarization),导致Transformer对不同序列产生无差别的时序关注,阻碍了深度模型的预测能力。为了解决序列的可预测性和模型能力之间的困境,作者提出了Non-stationary Transformer (NSTransformer)作为一个通用框架,其中有两个相互依赖的模块。序列平稳化(Series Stationarization)和去平稳化注意力(De-stationary Attention)。具体来说,序列平稳化模块统一了每个输入的统计特性,并将输出转换为恢复的统计特性,以提高可预测性。为了解决过平稳化问题,去平稳化注意力被设计出来,通过近似于从原始序列中学到的可区分的注意,将内在的非平稳信息恢复为时间依赖。作者提出的NSTransformer框架在很大程度上提升了主流Transformer模型的变体的预测性能,相比于Transformer,MSE降低了49.43%,相比于Informer,降低了47.34%,相比于Reformer,降低了46.89%。

模型框架

NSTransformer遵循先前在时间序列预测中使用的Transformer架构,采用标准的编码器-解码器结构,其中编码器从过去的数据中提取信息,而解码器则通过对过去的历史信息进行过汇总来实施预测。典型的NSTransformer是通过对Transformer的输入和输出进行序列平稳化处理,并用提出的非平稳注意机制取代self-attention,这可以提高基础模型的非平稳序列的预测能力。总之,NSTransformer主要包括下面两个模块:序列平稳化模块以及去平稳注意力模块。

0534b8b05d750d0ddad1f6e3c930136b.png

NSTransformer的基本框架

序列平稳化

序列平稳化主要模块两个模块,一个是归一化(Normalization)模块,另一个是反归一化(De-Normalization)模块。首先,归一化模块通过一个滑动窗口的形式对每一维时间序列数据进行归一化处理,这样窗口化的方式可以将每一个相邻窗口内的数据都具有相同的均值跟方差,以消除序列之间尺度上的差异性,并增加输入数据在时序上的分布稳定性。归一化的过程是:

19f4577e8eaad1f1f093fc8b40f89516.png

在模型预测结束之后,反归一化模块利用归一化时记录的均值跟方差信息,用来将模型的输出映射回原来的尺度,以恢复归一化时损失的信息。反归一化的过程是:

40f1e67bab011f55d9ca31a234e2201e.png

通过这两个阶段的变换,模型将接收到平稳的输入,这些输入遵循稳定的分布,更容易泛化。这样的设计还使模型对时间序列具有平移不变性和尺度不变性,从而有利于真实序列的预测。

aec9843a9cde0c2d957fde53e2611acb.png

序列平稳化过程(图片来自:https://zhuanlan.zhihu.com/p/587665491)

去平稳化注意力

去平稳化注意力机制去平稳化注意力机制的过程如下图所示:

3c9254495784e30d4c833138d8fb4347.png

去平稳化注意力机制(图片来自:https://zhuanlan.zhihu.com/p/587665491)

如前面所提到的,过平稳化问题是由内在的非平稳信息的消失引起的,这将使模型无法捕捉到用于预测的事件性时间依赖。因此,作者试图近似从原始的非平稳序列中去学习注意力。下面是Transformer计算注意力的原始公式:

e79ee539f6e567aa159573a24511e991.png

对于输入时间序列x,计算它的均值跟方差得到:

14e71bef945b0661b99da36a30d96ba5.png

除此之外,为了简化分析这里假设了用于嵌入的前馈层在时间维度是线性的,基于线性假设可以推导出  ,  与对平稳化后时间序列计算得到的  跟  的关系是:

d73cafd5400c9385e5493e74adff25a2.png

其中,  与  是  跟  在时间维度的均值。这样从原始时间序列中计算注意力机制的公式,可以被从平稳化后的时间序列中计算的  跟  替代为下面的公式,具体的推导可以参考原文的附录。

76ebce7993fc71977f0fea798981028a.png

这样得到的注意力公式不仅包含了原始时间序列的信息,也包含了经过平稳化后的序列信息。之后为了恢复对非平稳序列的原始注意力,这里作者将消失的非平稳信息重新引入到非平稳序列的计算中。为了得到所需要的计算值,作者引入了去平稳因子   跟  ,它们都是通过两个多层感知器从非平稳时间序列中计算得到的。进而,去平稳化注意力的计算方式可以得到如下形式:

9685b8b52df077e211bd287601dab0ed.png

这样,它既能利用平稳序列的可预测性,又能保持原始序列固有的时间依赖性。

2

环境配置

本地环境:

Python 3.7
IDE:Pycharm

库版本:

numpy 1.18.1
pandas 1.0.3 
sklearn 0.22.2
matplotlib 3.2.1
torch 1.10.1

NSTransformer源码Github链接:

https://github.com/thuml/Nonstationary_Transformers

3

代码实现

NSTransformer的官方代码实现借鉴了Informer的代码,因此,与之前的推文【python量化】将Informer用于股价预测类似,首先将NSTransformer的源码下载到本地,然后将我们的数据集放到某个路径下,这里仍然用到了上证指数14到17年四年的开高低收成交量数据。在将NSTransformer的代码用于我们的股票数据预测任务时,同样需要明确的是,我们的任务是基于高低收成交量来预测收盘价,这是一个多变量输入,单变量输出的预测任务。所以主要需要修改下面几个参数的设置。当需要进行不同预测任务时,如增加某些特征,预测多个目标变量等则可通过修改features,target,enc_in,dec_in以及c_out参数进行实现。NSTransformer的主要参数与Informer类似,主要包括:

model: ns_transformer,可以选择其他模型包括Informer,Transformer以及Autoformer。
data: 设置为custom,用于调用Dataset_Custom类,从而可以自定义数据集。
root_path:指定数据集存放的文件夹。
data_path:指定csv数据集的名称。
features:设置为MS,这是因为我们是用开高低收成交量来预测收盘价,所以是多变量输出来预测单变量。
target:表示预测变量,设置为Close,对应我们csv文件预测变量的列名。
freq:表示预测频率,设置为d,因为我们用到的是日线级别的数据。
seq_len:表示输入encoder的序列长度,这里设置为20。
label_len:表示输入decoder中的token的长度,这里设置为10,即通过前10个真实值来辅助decoder进行预测。
pred_len:表示预测序列的长度,这里设置为5,即表示预测后5个时刻的序列值。
enc_in:表示encoder的输入维度,这里设置为5,因为我们用到了开高低收以及成交量5个特征。
dec_in:表示decoder的输入维度,同enc_in。
c_out:表示输出序列的维度,这里设置为1,因为我们的目标变量只有收盘价。
moving_avg: 移动平均的窗口大小。
p_hidden_dims:去平稳性映射器的隐层维度。
p_hidden_layers:映射器的层数。

其他参数像模型层数,维度之类的可以根据自己的电脑配置进行修改。下面是进行上证指数预测实验的参数配置:

args.is_training = 1
args.model_id = 'test'
args.model='ns_Transformer'  # model name, options: [ns_Transformer, Transformer]


# data loader
args.data = 'custom' # dataset type
args.root_path ='./data/stock/' # root path of the data file
args.data_path ='SH000001.csv'  # data file
args.features='MS'   # forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate'
args.target='Close'    # 'target feature in S or MS task'
args.freq = 'd'     # freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h'
args.checkpoints ='./checkpoints/'  # 'location of model checkpoints'


# forecasting task
args.seq_len = 20     # input sequence length
args.label_len = 10   # start token length
args.pred_len = 5    # prediction sequence lengthargs.


# model define
args.enc_in = 5    # encoder input size
args.dec_in = 5    # decoder input size
args.c_out = 1     # output size
args.d_model = 256 # dimension of model
args.n_heads = 4   # num of heads
args.e_layers = 2  # num of encoder layers
args.d_layers = 1  # num of decoder layers
args.d_ff = 256   # dimension of fcn
args.moving_avg = 5  # window size of moving average
args.factor = 1    # attn factor
args.distil= True  # whether to use distilling in encoder, using this argument means not using distilling


args.dropout = 0.05    # dropout
args.embed = 'timeF'   # time features encoding, options:[timeF, fixed, learned]
args.activation = 'gelu'  # 'activation'
args.output_attention = True    #  help='whether to output attention in encoder
args.do_predict = True # whether to predict unseen future data


# optimization
args.num_workers = 0     # data loader num workers
args.itr = 1              # experiments times
args.train_epochs = 20    # train epochs
args.batch_size = 32      # batch size of train input data
args.patience = 3         # early stopping patience
args.learning_rate = 0.0001  # optimizer learning rate
args.des = 'test'         # exp description
args.loss = 'mse'         # loss function
args.lradj = 'type1'      # adjust learning rate
args.use_amp = False       # use automatic mixed precision training


# GPU
args.use_gpu = False       # use gpu
args.gpu = 0              # gpu
args.use_multi_gpu = False
args.devices = '0,1,2,3'  # device ids of multile gpus
args.seed = 2021          # random seed


# de-stationary projector params
args.p_hidden_dims = [128, 128]  # hidden layer dimensions of projector (List)
args.p_hidden_layers = 2         # number of hidden layers in projector

按照设置的参数,然后对模型进行训练跟测试:

Exp = Exp_Main


if args.is_training:
    for ii in range(args.itr):
        # setting record of experiments
        setting = '{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format(
            args.model_id,
            args.model,
            args.data,
            args.features,
            args.seq_len,
            args.label_len,
            args.pred_len,
            args.d_model,
            args.n_heads,
            args.e_layers,
            args.d_layers,
            args.d_ff,
            args.factor,
            args.embed,
            args.distil,
            args.des, ii)


        exp = Exp(args)  # set experiments
        print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
        exp.train(setting)


        print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
        exp.test(setting)


        if args.do_predict:
            print('>>>>>>>predicting : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
            exp.predict(setting, True)


        torch.cuda.empty_cache()
else:
    ii = 0
    setting = '{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format(
    args.model_id,
    args.model,
    args.data,
    args.features,
    args.seq_len,
    args.label_len,
    args.pred_len,
    args.d_model,
    args.n_heads,
    args.e_layers,
    args.d_layers,
    args.d_ff,
    args.factor,
    args.embed,
    args.distil,
    args.des, ii)


    exp = Exp(args)  # set experiments
    print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
    exp.test(setting, test=1)
    torch.cuda.empty_cache()

下面是在CPU上的训练过程。经过训练,可以看出模型的训练集上的loss不断下降,由于加入了early stop机制,所以经过6个epoch模型就停止训练了。经过在测试集上的测试,NSTransformer实现了0.0027的mse跟0.0415的mae(归一化后的结果)。需要注意的是,模型经过训练跟测试之后,会在当前路径的./checkpoints中保存模型参数,在./results/{settings}/下生成pred.npy以及true.npy文件用来分别存放测试集上的预测结果跟ground truth。

Use CPU
>>>>>>>start training : test_ns_Transformer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_fc1_ebtimeF_dtTrue_test_0>>>>>>>>>>>>>>>>>>>>>>>>>>
train 659
val 95
test 191
Epoch: 1 cost time: 1.7922062873840332
Epoch: 1, Steps: 20 | Train Loss: 0.0605105 Vali Loss: 0.0028209 Test Loss: 0.0028931
Validation loss decreased (inf --> 0.002821).  Saving model ...
Updating learning rate to 0.0001
Epoch: 2 cost time: 1.569800615310669
Epoch: 2, Steps: 20 | Train Loss: 0.0374645 Vali Loss: 0.0030634 Test Loss: 0.0028165
EarlyStopping counter: 1 out of 3
Updating learning rate to 5e-05
Epoch: 3 cost time: 1.5588312149047852
Epoch: 3, Steps: 20 | Train Loss: 0.0328267 Vali Loss: 0.0024335 Test Loss: 0.0027673
Validation loss decreased (0.002821 --> 0.002434).  Saving model ...
Updating learning rate to 2.5e-05
Epoch: 4 cost time: 1.5059726238250732
Epoch: 4, Steps: 20 | Train Loss: 0.0296629 Vali Loss: 0.0031771 Test Loss: 0.0028892
EarlyStopping counter: 1 out of 3
Updating learning rate to 1.25e-05
Epoch: 5 cost time: 1.6665441989898682
Epoch: 5, Steps: 20 | Train Loss: 0.0289504 Vali Loss: 0.0029475 Test Loss: 0.0027112
EarlyStopping counter: 2 out of 3
Updating learning rate to 6.25e-06
Epoch: 6 cost time: 1.5528459548950195
Epoch: 6, Steps: 20 | Train Loss: 0.0285680 Vali Loss: 0.0029404 Test Loss: 0.0027616
EarlyStopping counter: 3 out of 3
Early stopping
>>>>>>>testing : test_ns_Transformer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_fc1_ebtimeF_dtTrue_test_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
test 191
test shape: (5, 32, 5, 1) (5, 32, 5, 1)
test shape: (160, 5, 1) (160, 5, 1)
mse:0.0027673370204865932, mae:0.04154161363840103

调用模型的predict()方法可以直接预测所有数据后面的未知数据,因为这里预测长度为5,所以直接调用就相当于预测后5天的收盘价走势了。预测的结果会保存在./results/{settings}/下面的real_prediction.npy文件中。

exp = Exp(args)
exp.predict(setting, True)
# the prediction will be saved in ./results/{setting}/real_prediction.npy
prediction = np.load('./results/'+setting+'/real_prediction.npy')
plt.figure()
plt.plot(prediction[0,:,-1])
plt.show()

1cccc68cb2c284ea28929e0a3bbfb059.png

最后将完整的测试集上的预测结果进行可视化。

plt.figure()
plt.plot(trues[:,0,-1].reshape(-1), label='GroundTruth')
plt.plot(preds[:,0,-1].reshape(-1), label='Prediction')
plt.legend()
plt.show()

1384b0b287b4ea5a2626a663e1ced3c0.png

除此之外,NSTransformer的源码中也提供了Transformer、Informer以及Autoformer的实现。为了直观展示这几种模型之间的预测表现,我们采用相同的超参数对另外几种模型进行实验,并将其可视化的结果进行展示。需要注意是这里为了方便实验,每种模型的超参没有进行寻优而是统一采用了NSTransformer模型的实验配置。

bb73eb5c315ad88554456821322162d7.png

Transformer

19935e6a79689999789fb5893f56b886.png

Informer

955f3a2d18760d39b18ae1800d3e2e01.png

Autoformer

从可视化结果中可以看出相比于其他Transformer模型,NSTransformer实现了最好的拟合效果。最后统计这几种模型的MSE跟MAE(未反归一化),从误差上也可以看出NSTransformer实现了最低的预测误差,其次是Autoformer,Informer以及Transformer。

NSTransformer:
mse:0.0027673370204865932, mae:0.04154161363840103
Transformer:
mse:0.0147677231580019, mae:0.10331685841083527
Informer:
mse:0.01395915262401104, mae:0.09441611915826797
Autoformer:
mse:0.008317378349602222, mae:0.07286103069782257

4

总结

时间序列的非平稳性是现实时间序列数据中存在的重要特性,尤其是对金融时间序列来说。而现有大多数方法都会对数据做平稳化处理来提升预测性能,然而,平稳化处理的过程也会导致一部分信息的丢失。而NSTransformer通过设计的序列平稳化以及去平稳化注意力机制,使得它既能利用平稳序列的可预测性,又能保持原始序列固有的时间依赖性。文中通过将NSTransformer与其他模型包括Transformer,Informer以及Autoformer的实验对比,进一步证实了NSTransformer的预测性能。因此,在面对非平稳,高噪声的股票数据预测中,NSTransformer或许可以取得较好的预测表现。

本文内容仅仅是技术探讨和学习,并不构成任何投资建议。

参考文献:

Liu, Y., Wu, H., Wang, J., & Long, M. (2022). Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting. In Advances in Neural Information Processing Systems.

NeurIPS2022 | NSTransformers: 非平稳时间序列的通用预测框架 - 游凯超的文章 - 知乎 https://zhuanlan.zhihu.com/p/587665491

获取完整代码与数据以及其他历史文章完整源码与数据可加入《人工智能量化实验室》知识星球。

e7b051f269bb831be9611c844f1dce4b.png

《人工智能量化实验室》知识星球

5a35eed0747af33810b731b59c725608.png

加入人工智能量化实验室知识星球,您可以获得:(1)定期推送最新人工智能量化应用相关的研究成果,包括高水平期刊论文以及券商优质金融工程研究报告,便于您随时随地了解最新前沿知识;(2)公众号历史文章Python项目完整源码;(3)优质Python、机器学习、量化交易相关电子书PDF;(4)优质量化交易资料、项目代码分享;(5)跟星友一起交流,结交志同道合朋友。(6)向博主发起提问,答疑解惑。

b3a24f200e7d0ed1443d6d1493997de1.png

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

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

相关文章

我眼中的柔宇科技

关注、星标公众号&#xff0c;直达精彩内容来源&#xff1a;技术让梦想更伟大作者&#xff1a;李肖遥很早就知道了柔宇科技&#xff0c;当时是因为知道创始人刘自鸿&#xff0c;23岁清华本硕毕业&#xff0c;26岁获斯坦福大学电子工程博士学位&#xff0c;历时不超过3年&#x…

你真的了解环形队列吗?(学习数据结构必须掌握的模型)

目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…

NCNN量化详解2

1 NCNN量化算法简介 量化算法介绍的文章的话,下面这篇文章的大佬 @章小龙 介绍的比我好多啦。虽然介绍的是NVIDIA TensorRT的算法,但是NCNN是参考其算法做出来的,方法几乎一样 首先NVIDIA有一个PPT,很好的阐述了他们的方案,推荐大家也去看一下: https://link.zhihu.com…

我来了,RK第七届开发者大会

大家好&#xff0c;我是发哥的朋友windsnake「也是发哥文章里面经常出现的邓总」。今年终于是有时间参加了一次Rk的开发者大会&#xff0c;这篇文章记录下自己的所见所闻&#xff0c;算是对自己福州之行的一次总结。从深圳出发月亮还没睡醒的早上&#xff0c;坐5号线杀到深圳北…

【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

【无标题String、StringBuffer、StringBuilder区别】

一、背景。 这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细&#xff0c;对大家的学习或工作具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下。放假在家里休息&#xff0c;闲来无事&#xff0c;想…

华为OD机试题,用 Java 解【汽水瓶】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

【华为OD机试模拟题】用 C++ 实现 - 寻找路径 or 数组二叉树(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明寻找路径 or 数组二叉树题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过…

华为开源自研AI框架昇思MindSpore数据变换:Transforms

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、数据变换 TransformsCommon TransformsComposeVision TransformsRescaleNormalizeHWC2CWHText TransformsBasicTokenizerLookupLambda Transforms通常情况下&#xff0c;直接加载的原始数据并不能直接送入…

线程安全之synchronized和volatile

目录 1.线程不安全的原因 2.synchronized和volatile 2.1 synchronized 2.1.1 synchornized的特性 2.1.2 synchronized使用示例 2.2 volatile 我们先来看一段代码&#xff1a; 分析以上代码&#xff0c;t1和t2这两个线程的任务都是分别将count这个变量自增5000次&#xff…

redis(5)列表List

Redis列表 Redis单键多值&#xff1a;Redis 列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 它的底层实际是个双向链表&#xff0c;对两端的操作性能很高&#xff0c;通过索引下标的操作中间的节点性能会较差。 常…

【Linux学习笔记】7.Linux vi/vim

前言 本章介绍Linux的vi/vim。 Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c…

【华为OD机试模拟题】用 C++ 实现 - 优秀学员统计(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

HashMap数据结构

HashMap概述 HashMap是基于哈希表的Map接口实现的&#xff0c;它存储的是内容是键值对<key,value>映射。此类不保证映 射的顺序&#xff0c;假定哈希函数将元素适当的分布在各桶之间&#xff0c;可为基本操作(get和put)提供稳定的性能。 HashMap在JDK1.8以前数据结构和存…

网络流与图(三)

经过两篇文章的篇幅&#xff0c;我们介绍了最小费用网络流模型以及解决的算法。今天我们介绍网络流模型的现实应用案例&#xff0c;并针对一些特殊的情景提出更高效的解决算法。传送门&#xff1a;网络流与图&#xff08;一&#xff09;网络流与图&#xff08;二&#xff09;1运…

多模态预训练模型综述

经典预训练模型还未完成后续补上预训练模型在NLP和CV上取得巨大成功&#xff0c;学术届借鉴预训练模型>下游任务finetune>prompt训练>人机指令alignment这套模式&#xff0c;利用多模态数据集训练一个大的多模态预训练模型&#xff08;跨模态信息表示&#xff09;来解…

【数据结构】栈的接口实现(附图解和源码)

栈的接口实现&#xff08;附图解和源码&#xff09; 文章目录栈的接口实现&#xff08;附图解和源码&#xff09;前言一、定义结构体二、接口实现&#xff08;附图解源码&#xff09;1.初始化栈2.销毁栈3.入栈4.判断栈是否为空5.出栈6.获取栈顶元素7.获取栈中元素个数三、源代码…

【华为OD机试模拟题】用 C++ 实现 - 字符匹配(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明字符匹配题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。…

C++10:非类型模板参数以及模板的特化

目录 非类型模板参数 模板的特化 模板类的特化 1.全特化 2.偏特化 模板其实还有其他的玩法&#xff0c;比如非类型模板参数以及模板的特化。 非类型模板参数 在记述非类型模板参数前&#xff0c;我们认识一下C中一个比较鸡肋的类&#xff0c;array #include<iostream&g…

Kotlin1.8新特性

Kotlin1.8.0新特性 新特性概述 JVM 的新实验性功能&#xff1a;递归复制或删除目录内容提升了 kotlin-reflect 性能新的 -Xdebug 编译器选项&#xff0c;提供更出色的调试体验kotlin-stdlib-jdk7 与 kotlin-stdlib-jdk8 合并为 kotlin-stdlib提升了 Objective-C/Swift 互操作…