论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》

题目:基于Transformer的无监督心电图(ECG)信号异常检测

摘要

        异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而,为了确保一致性和可靠性,需要复杂的预测分析模型。随着收集数据的规模和维度的增加,深度学习技术,例如自编码器(AE)、循环神经网络(RNN)和长短期记忆(LSTM),受到越来越多的关注,并被认为是最先进的异常检测技术。最近,基于Transformer架构的发展被提出作为改进的注意力机制的知识表示方案。我们提出了一种无监督的基于Transformer的方法来评估和检测心电图(ECG)信号中的异常。模型架构包括两部分:嵌入层和标准的Transformer编码器。我们在两个著名的数据集ECG5000和MIT-BIH Arrhythmia中引入、实现、测试和验证了我们的模型。根据实际和预测的ECG时间序列序列之间的损失函数结果来检测异常。我们发现,使用Transformer编码器作为异常检测的替代模型能够在ECG时间序列数据中实现更好的性能。建议的模型在检测ECG信号中的异常方面具有显著的能力,并在两个数据集上优于文献中的深度学习方法。在ECG5000数据集上,该模型可以以99%的准确率、99%的F1分数、99%的AUC分数、98.1%的召回率和100%的精确度检测异常。在MIT-BIH Arrhythmia数据集上,该模型的准确率为89.5%,F1分数为92.3%,AUC分数为93%,召回率为98.2%,精确度为87.1%。

引言

        异常检测对许多当代应用来说至关重要,并随着传感器使用的爆炸式增长而变得尤为重要。心电图(ECG)时间序列数据的异常检测近年来引起了相当大的关注,因为它对控制ECG时间序列过程的质量和识别异常数据源行为有着重要的影响。在时间序列数据的异常检测过程中,涉及使用复杂的算法和模型来检测在选定时间段内的异常数据。有效的异常检测器能够识别正常和异常时间序列数据之间的差异。 

        随着对实时异常检测的需求日益增长,人们已经意识到需要智能、稳健和计算效率高的模型,并且这种需求正在在大多数实时应用中受到更多关注。由于错误事件的不可避免性,这些模型在大多数时间序列应用中发挥着关键作用。时间序列数据的特性对于选择合适的异常检测方法至关重要。成功的异常检测器通过测量时间序列数据的统计偏差来识别异常,例如自回归移动平均(ARIMA)、累积和统计(CUSUM)和指数加权移动平均(EWMA)。然而,另一方面,传统的时间序列异常检测方法在模型的期望效率和准确性方面存在缺陷。

        最近,已经开发了几种用于异常检测的智能计算方法。其中,深度学习和神经网络是准确高效的热门算法。然而,从2000年代末开始,人们对于在大量和高度变异的在线时间序列数据中识别异常的兴趣逐渐增长。除了常用的技术,如自编码器(AEs)、循环神经网络(RNNs)、卷积神经网络(CNN)和长短期记忆(LSTM),当代深度神经架构通常用于异常检测和医疗预测。尽管这些方法已经发展以克服之前提出的技术,但它们大多数在处理时间序列数据时具有固有的特性限制其使用。例如,LSTM神经网络通过使用乘性门在特殊单元(记忆单元)的内部状态中施加常量误差流,克服了RNN面临的梯度消失问题。此外,LSTM网络不需要预先指定的时间窗口,并且可以准确地建模复杂的多变量序列,因为它们具有学习系列中长期相关性的能力。然而,这些方法的主要目标是生成更真实的序列,而不是提取有助于后续任务的有意义的特征。

        目前,在自然语言处理(NLP)中,首次引入了遵循预测过程的Transformer架构作为对循环神经网络RNNs的高效替代方案。因此,在这项工作中,我们介绍了一种基于Transformer架构的异常检测模型,用于检测人类心跳时间序列信号中的异常,例如室性早搏(PVC)、室上性早搏(SP)或异位心搏(EB),以及其他心电图(ECG)异常。在这里,我们使用中引入的Transformer编码器来开发新颖的无监督Transformer异常检测。该模型通过比较预测数据和原始数据之间的损失函数,学习正常数据的分布模式并检测异常。提出的模型在检测ECG时间序列数据方面优于当前最先进的深度学习建模方法。

        在接下来的文章中,我们将在相关工作部分对心电图时间序列中的深度学习异常检测的现有文献进行调查。在材料和方法部分,我们将介绍所提出的模型和使用的数据集。实验设置和结果分析将在结果和讨论部分展示。最后,本文以结论结束。

相关工作

       我们介绍一些用于心电图时间序列异常检测的现有深度学习模型。在[21]中,作者使用LSTM单元神经网络架构构建了一个用于健康心电图信号的预测模型。使用LSTM网络的一个额外优势是,ECG信号可以直接输入网络,无需复杂的预处理。研究结果乐观,并显示LSTM模型可能适用于检测心电图信号中的异常。此外,在[18]中,作者提出了基于LSTM网络的编码器-解码器框架,用于学习重构正常时间序列行为,并通过重构误差检测三个可预测时间序列数据集:电力需求、航天飞机和心电图。结果显示,该模型具有鲁棒性,可以检测可预测、不可预测、周期性、非周期性和准周期性的时间序列。值得注意的是,在[22]中,作者将AE与LSTM相结合,使用来自心肌梗死患者的心电图数据,展示了该系统可以准确分类不规则波间隔。在[23]中,堆叠LSTM网络用于时间序列的异常检测。该方法的有效性在四个数据集上得到了证明:心电图、航天飞机、电力需求和多传感器发动机数据集。在[24]中,作者专注于使用LSTM和GAN融合模型(LSTM-GAN)来识别时间序列数据中的异常。作者通过两组时间序列数据验证了算法的输出。实验结果表明,与传统算法相比,LSTM-GAN在处理时间序列数据方面表现出更优异的性能。Schlegl等人[25]开发了基于Anomaly Detection Generative Adversarial Nets(AnoGAN)模型的深度卷积生成对抗网络(DC-GAN)用于异常检测。作为无监督学习模型,AnoGAN使用正常数据进行学习。通过将其与查询数据进行比较,可以检测异常。在该方法中,决策边界是主观的。因此,需要根据条件进行多次实验,以应用决策边界。LSTM还可用于无监督学习,例如在[26]中,作者使用MIT-BIH心律失常数据集以无监督学习方式检测心电图信号中的异常。

        然而,只有少数模型在时间序列异常检测中使用了基于Transformer的架构。在[27]中,作者提出了一种基于Transformer和生成对抗网络(GAN)的时间序列数据异常检测方法。基于Transformer的生成器可以提取时间序列数据的上下文特征以提高性能。在训练和异常检测阶段,作者使用了两个编码器和两个解码器的Transformer块。他们展示了该模型在异常检测方面比使用三个数据集(Secure Water Treatment(SWaT)、Water Distribution(WADI)和KDD Cup 1999)的最先进的异常检测技术具有更好的性能。在[28]中,作者在时间序列数据中使用了Transformer架构;该模型包含三个编码器块和一个解码器块。输入的时间序列数据被分成训练序列和标签序列,其中训练序列被输入到编码器,而标签序列被输入到解码器。他们还用多分支注意力机制替换了原始的多头自注意力方法。对于WADI和SWaT数据集,F1分数分别为0.84和0.91。

        从以上讨论中,我们意识到基于Transformer的异常检测方法在检测心电图异常方面具有巨大的潜力,这是由于Transformer的高效性和同时获取长距离上下文数据的能力。我们将采用Transformer方法作为一种未经监督学习的模型来检测心电图时间序列数据中的异常,这在此领域之前尚未被使用过。然而,[29]等文献以及一些最近发表的论文考虑了需要大量标记的端到端学习方法,这是监督学习的特点。对于时间序列数据,标记数据可能并不总是可用的。我们的工作仅考虑了无监督学习,以更好地适应输入信号。此外,我们的模型与现有模型不同,因为它由两个标准的编码器Transformer层组成,没有解码器。因此,在这项工作中,我们将调查Transformer编码器在心电图时间序列异常检测方面的能力,并将我们的发现与最先进的深度学习模型在准确性和F1分数上进行比较,详细内容稍后说明。

 数据与方法

ECG

        时间序列是按照时间顺序组织的数据点的集合。通常,时间序列是在连续的相似间隔时间点上采集的序列。在这项工作中,我们使用了ECG5000数据集和MIT-BIH Arrhythmia数据集来验证所提出的模型。这两个数据集都属于心电图领域。

 ECG500

        在我们的实验中,我们使用了一个包含5000个心电图(ECG5000)时间序列的数据集[30]。原始数据来自PhysioNet的BIDMC Congestive Heart Failure Database (CHFDB)。在两个处理过程中,数据首先被预处理:首先提取每个心跳,并将每个心跳插值为相同的长度,等于140个时间步长。根据图1,有五种不同的心跳类型:正常(N)、R-on-T VPC(R-on-T)、室性早搏(PVC)、室上性早搏(SP)或异位心搏(EB),以及未分类的心跳(UB)。

        ECG5000数据集是通过从外推的心电图中选择5000个序列创建的,其中2989个序列是正常心跳,剩下的2011个序列是异常心跳。对于我们提出的模型,数据被按照80:10:10的比例划分为三个集合——训练集、验证集和测试集。由于我们采用了无监督学习,我们从训练集和验证集中排除了异常数据。在训练阶段,模型学习了正常心跳的潜在空间。表1列出了每个数据集中序列的数量。

MIT-BIH Arrhythmia

         MIT-BIH Arrhythmia数据库是一种临床数据库,其中包含了在贝斯以色列医院(BIH)心律失常实验室对48名患者进行的两通道心电图(ECG)记录。每个记录持续半小时。在本研究中,选择了修改后的肢体导联Ⅱ信号。根据美国医学仪器协会(AAMI)[33]的建议,将选择的心跳分为以下五类:正常心跳(N)、室上性异位心跳(S)、室性异位心跳(V)、融合心跳(F)和未知心跳(Q)。根据AAMI的建议,我们选择了48个记录中的44个用于我们的实验,并移除了四个记录(102、104、107和217),因为它们质量较差。

        信号预处理是一个重要的步骤,特别是在处理生理数据,如心电图(ECG)时,需要考虑所有潜在的噪声来源,比如运动伪影和电源干扰,这些噪声可能会影响后续模型的性能。我们的预处理阶段包含两个步骤。首先,我们应用滤波器来消除噪声,然后提取心跳信号。我们尝试了不同的滤波器,如巴特沃斯带通滤波器、带通滤波器和中值滤波器,我们发现两个中值滤波器的效果更好。本研究中采用了以下预处理步骤:

        中值滤波器:我们使用了一个滑动窗口为200毫秒的中值滤波器。然后,我们使用一个600毫秒的窗口,再次应用了第二个中值滤波器。原始信号的基线包含在第二个滤波器的输出中。将第二个滤波器的输出从未经处理的ECG数据中减去,以消除基线漂移(见图2)。这一步增强了基线校正,并消除了一些伪影。

        心跳提取:这涉及在每个心跳周围选择一个邻域。该间隔是通过在心跳前后±50毫秒处进行R峰标注来估计的。

        在心跳提取之后,正常序列的总数为72,722个,而异常序列的总数为10,579个。由于正常序列的数量比异常序列大很多,我们从中随机采样了18,824个序列。数据被划分为80%的训练数据和20%的测试数据。将训练数据再分为训练数据和验证数据,其中只包含N心跳。表2总结了每个数据集中序列的数量。

 提议的无监督Transformer架构

        在本论文中,我们介绍了一种基于Transformer的网络,用于心电图信号的异常检测。整体模型架构由两个部分组成:嵌入层和标准Transformer编码器(见图3)。所有正常的心电图信号时间序列数据,形式为一个2D张量,包含序列长度 × 特征数量,首先被编码成嵌入序列,然后输入到一个多层双向Transformer网络中,生成对应的表示。最后的线性稠密层预测输入的心电图信号,具有相同的输入序列长度。

         引入了嵌入层用于将输入张量映射到更高维度的特征空间。由于输入维度与Transformer隐藏层的大小相关,我们将该层分为两部分:一个线性稠密层,用于将输入投影到更高维度的向量,以及一个Dropout层,以避免过拟合。我们使用了正弦位置编码来对输入序列的顺序进行编码:

        其中,pos表示位置,i表示维度,dmodel表示模型的嵌入大小(即特征向量的维度)。         

        在寻找最佳模型配置的过程中,我们测试了使用一个和两个Transformer编码器块的情况。第一个Transformer编码器块创建了嵌入序列输入的等效隐藏表示。然后,为了逐步生成更高层次的表示,这些表示被作为输入传递给第二个Transformer编码器块。单个Transformer块(如图3所示)包括两个主要子层:一个位置感知的全连接前馈网络和一个多头自注意层(FFN)。两个子层都采用残差连接和层标准化。如图4所示,组成多头注意力层的h个并行缩放点积注意力层中的每一个被称为一个头。通过缩放点积注意力,将查询向量和一组键值对转换成输出向量。

         其中,Q、K和V分别表示由多个查询、键和值向量组成的矩阵,每个向量作为一行堆叠,查询/键向量的维度为dk。在计算注意力之前,多头注意力通过使用不同的线性稠密层将Q、K和V映射到各种较低维度的特征子空间。然后,使用一个额外的稠密层将h个头的输出连接在一起,并投影到最终的隐藏表示中,如下所示:

        Transformer的自注意机制通过学习输入序列的内在关系。自注意机制中的查询、键和值向量都是相似的。换句话说,在序列中的每个位置,都会计算该位置与其他位置之间的注意力。因此,每个观察值的隐藏表示捕捉了全局序列信息,并通过对序列中所有位置的加权求和来强调第i个观察值周围的区域。

         接着,对每个位置的隐藏状态进行了位置感知的前馈网络(FFN)处理,处理是独立且相同的。该前馈网络由两个线性变换组成,它们之间有一个ReLU激活函数:

        其中,xi是由多头注意力层产生的第i个隐藏状态,W1和W2是权重矩阵,b1和b2分别是内部和输出稠密层的偏差项。

异常分数和阈值

        因为我们实现了一种无监督的模式,模型仅在一个 N 心跳序列上进行训练。该模型预测输入序列的原始值。我们的模型的损失函数是平均绝对误差(MAE),其计算方式如下所示,即方程(7)。在类似于的情况下,通常使用均方根误差(RMSE)作为损失函数。然而,我们发现MAE是最佳选择,因为它表现更好。

        MAE是每个信号实际值yi和模型预测值xi之间的总绝对差异。通过训练,模型学习了正常信号的显著性和激活特征,从而导致更低的损失预测误差。该模型通过计算预测的损失误差是否大于一个固定的阈值来检测测试数据中的异常。在本文中,阈值等于训练正常数据的平均损失值加上两个标准偏差,如下所示的方程式: 

        在使用训练数据计算了阈值后,该过程被转化为一个二元分类问题。在异常检测阶段,通过比较预测误差来判断数据序列是正常还是异常,而这个计算出的阈值起到了决定作用。使用测试数据时,将一个特定的输入序列提供给模型,然后将预测误差与计算得到的阈值进行比较。如果预测误差超过阈值,那么该输入序列被归类为异常;否则,被归类为正常。 图5展示了我们的异常检测模型的图形化架构过程,以便更清楚地理解。

结果与结论

 实验配置

        为了对我们的模型进行微调,我们进行了许多实验,尝试了不同数量的Transformer编码器块(包含多头注意力层和接着的前馈层),不同的隐藏状态大小和不同数量的注意力头。仅在第一个密集层上实施了0.2的丢弃率的Dropout。我们使用Adam优化器,学习率为1e-4,并使用了早停技术。模型最多训练70个epochs,但在此之前所有实验都已经收敛。我们在批次大小为16个序列的情况下,仅使用正常数据对模型进行了训练。所有实验均使用Python(v3.7.6)、Tensorflow(v1.14.0)和Keras(v2.3.1)机器学习库进行实现。我们在Windows 10 Pro 64位操作系统上运行所有实验,使用了AMD Ryzen 5 3600 6核处理器(主频3.59 GHz)、NVIDIA 185 GEFORCE RTX 2080 SUPER(GPU)以及32GB的内存。

性能指标

        真正例(True Positive,TP)表示在二元分类器中被准确地预测为正例的值,真负例(True Negative,TN)表示被正确地预测为负例的值。假正例(False Positive,FP)是负例的预期值,但被错误地预测为正例,而假负例(False Negative,FN)是正例的预期值,但被错误地预测为负例。我们的模型的异常检测结果通过以下指标进行评估:ROC曲线下面积(AUC)、准确度(accuracy)、精确率(precision)、召回率(recall)和F1得分(F1-scores)。 

        AUC(曲线下面积):AUC是通过构建基于假正例(FP)和真正例(TP)的接收者操作特征曲线(ROC曲线)来计算的。

ECG500 数据库实验结果

        该提议的模型是在正常心跳上进行训练的,因此学习了正常信号的分布。异常心跳不遵循这个分布,因此当将它们输入模型时,模型无法准确预测。为了直观地观察这一点,我们使用测试数据集在图6中展示了输入时间序列和预测时间序列。该图显示实际和预测的正常心跳信号大致相同(图6b)。然而,当输入是一个异常心跳信号时,模型将其映射到连续的正常心跳的潜在空间,如图6a所示,这为异常检测提供了机会。尽管某些异常样本通常与它们的正常预测相似,但局部差异可以帮助区分它们。

        如表3所示,我们训练了一系列无监督的Transformer网络来确定最佳的编码器块数量(1或2)、嵌入大小(32、64、128或256)和注意力头数量(16或32)。表现最佳的模型包含两个编码器块、128的嵌入大小和32的注意力头,取得了令人印象深刻的结果,F1分数为99%,准确度为99%,召回率为98.1%,精确率为100%。计算得到的阈值为0.29。然而,从表3中我们可以观察到,较大的嵌入大小获得了更好的模型性能。由于我们的模型处理不同时间步的心跳信号,因此更适用于顺序时间序列数据。图7展示了ROC曲线,该曲线绘制了真正例率(True Positive Rate,TPR)与假正例率(False Positive Rate,FPR)在不同分类阈值下的变化,以表示模型在区分正类和负类方面的能力。我们的模型实现了99%的AUC分数,表明该模型是一个完美的分类器模型,因为较高的AUC分数意味着更好的预测能力。

        由于ECG5000数据集已经在之前的研究中被使用过,将我们的模型与其他有监督和无监督方法进行比较对于了解其优劣势以及在异常检测领域的地位非常关键。在表4中展示了一些有监督和无监督算法在相同数据集上的结果。在[41]和[42]中,数据集的划分为4500个心跳(80%)用于测试,500个心跳(20%)用于训练和验证任务(20%)。在[41]中,作者使用变分递归自编码器(VRAE)来表示数据,然后应用聚类和Wasserstein距离来检测异常,成功地在ECG5000数据集上实现了超越现有有监督和无监督方法的异常检测性能。同样地,在[42]中,作者使用相同的变分自编码器(VAE)方法结合局部相似度评分在我们的两个数据集上,即ECG5000和MIT-BIH Arrhythmia,在AUC方面取得了与文献中类似的结果。然而,我们的模型在所有评估指标上都超过了这些深度学习模型,具有99%的F1分数,99%的准确率,98.1%的召回率和100%的精确率。然而,由于我们使用了不同的数据划分方法,这种比较被认为是不公平的。因此,我们将我们的结果与[43]和[44]最近获得的结果进行了比较,因为数据的划分为80%的训练集、10%的验证集和10%的测试集,与我们在这里所做的完全相同。[43]中的作者使用了Concat Attention Autoencoder(CAT-AE)、AE-without-Attention和VAE,声称在异常检测中达到了最先进的准确率和精确率。另一方面,[44]中的作者使用了无监督的LSTM自编码器。如表4所示,我们的模型在使用相同数据划分方法的情况下,超越了这些深度学习模型。

 MIT-BIH Arrhythmia数据库实验结果

        图8展示了异常和正常心跳的示例,以及它们对应的预测结果。正常心跳在模型的预测下表现得相当准确,如图8b所示。毫无疑问,模型已经捕捉到了正常心脏周期模式的基本形态行为。模型可以尽量调整输出来适应正常的潜在空间,同时不断努力最小化预测误差。模型试图仅使用心脏周期的正常属性来预测输入,因此异常心跳被映射到一个正常心跳的潜在空间。正如预期的,这导致了异常心跳的较低预测质量和较高的预测误差,如图8a所示。 

        如表5所示,我们训练了多个Transformer编码器网络来确定最佳的注意力-前馈块数量(1或2)、嵌入大小(512或1024个神经元)和注意力头数量(16或32)。从表5可以看出,不同模型的Transformer编码器异常检测结果在MIT-BIH测试数据集上表现相近。然而,表现最佳的模型配置包含两个块,64的嵌入大小和32个注意力头。我们表现最好的Transformer编码器模型实现了89.5%的准确率,92.3%的F1分数,98.2%的召回率和87.1%的精确率。图9展示了最佳模型在测试集上的ROC曲线,AUC得分为93%,这意味着该模型在区分异常和正常信号方面表现相对良好。计算得到的阈值为0.12。

        表6显示了我们的结果与其他使用MIT-BIH数据集的深度学习异常检测模型的比较。在[26]中,作者使用堆叠LSTM并应用无监督训练,因为在训练模型时不需要异常类别。数据集的划分为80%训练和20%测试。因此,我们还将我们的模型与他们的模型进行了比较,因为他们遵循了相同的训练过程和数据划分。我们的模型实现了92.3%的F1分数,98.2%的召回率和87.1%的精确率,而他们的模型报告了81%的F1分数,87%的召回率和82%的精确率,这表明我们的模型优于无监督的LSTM尝试。此外,在[45]中,作者使用了一种新颖的混合架构,由LSTM单元和多层感知器(MLP)组成,数据集的划分为70%训练和30%测试。他们在监督学习方式下实现了87%的F1分数和75%的灵敏度,这也低于我们的结果,然而更高的准确率可能归因于他们使用了监督学习。最后,在[42]中,作者使用了无监督的变分自编码器,并采用AAMI数据集划分,但其F1分数和准确率分别为76.55%和87.77%,分别是最低的。与使用有监督或无监督深度学习模型的最新应用异常检测方法相比,我们的模型表现更好。然而,该模型在异常检测方面的性能仍然缺乏令人满意的F分数。

 总结

        我们提出了一种稳健有效的无监督Transformer异常检测模型,用于处理时间序列数据。该模型被用于检测人类心跳时间序列信号中的异常,例如早搏(premature ventricular contraction,PVC)、室上性早搏(supraventricular premature,SP)和其他心电图异常。该模型的架构由Transformer编码器网络和线性密集解码器网络组成。心电图时间序列异常检测方法基于序列预测方法,包含两个阶段:模型训练,在此阶段模型学习正常数据的分布;异常检测,在此阶段计算心电图时间序列的异常得分以识别异常情况。我们通过使用预先设定的阈值(训练损失的均值加上两倍的标准差)将异常检测方法调整为无监督框架。

        我们已经展示了如何利用Transformer编码器进行心电图时间序列的异常检测。我们在ECG5000和MIT-BIH Arrhythmia数据集上的结果表明,Transformer编码器在这个任务中是一个可行的替代方案。我们将Transformer编码器与几种最先进的深度学习模型进行了对比测试,结果表明我们的模型在准确率、F1分数、召回率和精确率等方面表现优于其他模型。对于ECG5000心跳数据集,我们实现了99%的准确率、99%的F1分数、100%的精确率、98.1%的召回率和99%的AUC得分,展现了在确定ECG心跳信号异常方面的出色能力。此外,我们的模型在MIT-BIH Arrhythmia数据集上表现良好,具有92.3%的加权F1分数、89.5%的准确率、93%的AUC得分、98.2%的召回率和87.1%的精确率。此外,我们提出的模型在使用MIT-BIH Arrhythmia数据集进行最近的ECG分析中表现出比其他深度学习模型更加稳健的性能。尽管本研究主要集中在将模型与深度学习异常检测方法进行比较,但我们未来的工作目标是扩展对其他时间序列数据异常检测技术的研究。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO搜索引擎优化

目录 场景 内部业务To B (Business-to-Business,B2B)需要降低SEO,反爬 客户业务To C (Business-to-Consumer,B2C)需要提高SEO TDK优化 Title(标题) Description(描述) Keywords&#xff…

matplotlib 笔记 plt.grid

用于添加网格线 主要参数 visible 布尔值,True表示画网格 which表示要显示的刻度线类型,可以是 major(主刻度)或 minor(次刻度),或者同时显示(both)alpha 透明度 …

Effective Java笔记(27)消除非受检的警告

用泛型编程时会遇到讲多编译器警告 : 非受检转换警告( unchecked cast warning )、非受检方法调用警告、非受检参数化可变参数类型警告( unchecked parameterized vararg type warning),以及非受检转换警告…

【Pyhthon实战】Python对全校电费查询采集并可视化分析

前言 今天,我来说说怎么抓取宿舍电费的过程。我们学校是在完美校园交电费的,我们可以不用取抓包完美校园的数据接口,我们可以直接登录学校的一卡通网站,每个学校都有,大家可以自己找找,这里我为什么要抓包呢,因为学校提供的网站已经打不开了,这里就不介绍怎么抓包了。 …

9篇论文速览 ICML 2023 测试时自适应(TTA)最新研究进展

测试时自适应对于领域转移下真实机器感知应用的成功至关重要,近年来,研究者们仍然在不断优化现有的方法。在今年的ICML中,TTA相关的研究也有了最新进展。 1.Uncovering Adversarial Risks of Test-Time Adaptation 标题:揭示测试…

Java 常用编辑器 IntelliJ IDEA

文章目录 IDEA 概述IDEA 下载和安装IDEA 中的第一个代码IDEA 的项目和模块操作(一)类的操作(二)模块的操作(三)项目的操作 IDEA 概述 IntelliJ IDEA是一款由JetBrains开发的集成开发环境(IDE&am…

git【潦草学习】

初始配置git 查询版本号 初次使用git前配置用户名与邮箱地址 git config --global user.name "your name" git config --global user.email "your email" git config -l 发现最后两行多出了用户名和邮箱,说明配置成功

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…

多个配置WebMvcConfigurationSupport失效问题

最近在项目中用类继承WebMvcConfigurationSupport实现拦截器 Configuration RequiredArgsConstructor public class SpringWebSupport extends WebMvcConfigurationSupport {private final ProjectInterceptor projectInterceptor;// 拦截器 //设置拦截器对象和拦截请求Ove…

【广州华锐视点】VR燃气轮机故障判断模拟演练系统

VR燃气轮机故障判断模拟演练系统由广州华锐视点开发,是一款基于虚拟现实技术的教育工具,旨在为学生提供一个安全、高效、互动的学习环境,帮助他们更好地掌握燃气轮机的故障诊断技能。 这款VR实训软件能够模拟真实的燃气轮机故障诊断场景&…

章节4:JavaScript操作Cookie

章节4:JavaScript操作Cookie 直接利用Cookie登录 JavaScript语法 获取:document.cookie; 设置:document.cookie“usernamexx”; 删除:document.cookie“usernamexx;expiresThu, 01 Jan 1970 00:00:00 GMT”;

C语言进阶第二课-----------指针的进阶----------升级版

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

图像的转置之c++实现(qt + 不调包)

1.基本原理 图像的转置就是将图像的横坐标和纵坐标交换位置,和矩阵的转置是一样的,公式见下: 2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解) /*图像的转置函…

Qt画波浪球(小费力)

画流动波浪 #ifndef WIDGET3_H #define WIDGET3_H#include <QWidget> #include <QtMath> class widget3 : public QWidget {Q_OBJECT public:explicit widget3(QWidget *parent nullptr);void set_value(int v){valuev;}int get_value(){return value;} protecte…

nginx负载均衡

目录 负载均衡 nginx的七层代理和四层代理 四层代理与七层代理之间的区别 四层和七层谁的速度快&#xff1f; 正向代理与反向代理 负载均衡 upstream 算法 算法总结 stream 负载均衡 通过反向代理来实现 nginx的七层代理和四层代理 七层是最常用的反向代理方式&am…

Excel---成绩相同者,名次并列排列,三步搞定

需求&#xff1a;一张成绩表&#xff0c;共341行(340条数据&#xff0c;第一条为标题)&#xff0c;根据成绩进行排序&#xff0c;成绩相同进行名次并列 一、选择生成结果的位置&#xff0c;我这里点击了一下E2单元格 二、公式—>插入–>rank函数 数值&#xff1a;D2 表示…

SpringBoot 简单入门部署

1. 环境要求 Java 8 (配置环境变量)Maven 3.3idea 2019.1.2 及以上 1.1 maven 配置 <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/n…

Spring源码——初识Spring容器

Spring源码之工厂&#xff08;容器&#xff09; 为什么把Spring的工厂又叫做容器呢&#xff1f; 工厂的责任是创建对象&#xff0c;但是创建完对象后还要进行存储&#xff08;针对于单例的对象来讲&#xff09;&#xff0c;以供其他地方使用&#xff0c;这就是容器。为了能存…

Redis布隆过滤器的原理和应用场景,解决缓存穿透

目录 一、redis 二、布隆过滤器 三、缓存穿透问题 四、布隆过滤器解决缓存穿透 一、redis Redis&#xff08;Remote Dictionary Server&#xff09;是一种开源的内存数据存储系统&#xff0c;也是一个使用键值对&#xff08;Key-Value&#xff09;方式的高性能数据库。Red…

vscode插件不能搜索安装

1 现象 vscode搜索自己的插件&#xff0c;报错&#xff1a; Error while fetching extensions. HXR failed2 原因 之前用vscode开发golang语言&#xff0c;设置了proxy代理&#xff0c;所以导致错误&#xff0c;删除即可 重启vscode 3 结果