《异常检测——从经典算法到深度学习》28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

《异常检测——从经典算法到深度学习》

  • 0 概论
  • 1 基于隔离森林的异常检测算法
  • 2 基于LOF的异常检测算法
  • 3 基于One-Class SVM的异常检测算法
  • 4 基于高斯概率密度异常检测算法
  • 5 Opprentice——异常检测经典算法最终篇
  • 6 基于重构概率的 VAE 异常检测
  • 7 基于条件VAE异常检测
  • 8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测
  • 9 异常检测资料汇总(持续更新&抛砖引玉)
  • 10 Bagel: 基于条件 VAE 的鲁棒无监督KPI异常检测
  • 11 ADS: 针对大量出现的KPI流快速部署异常检测模型
  • 12 Buzz: 对复杂 KPI 基于VAE对抗训练的非监督异常检测
  • 13 MAD: 基于GANs的时间序列数据多元异常检测
  • 14 对于流数据基于 RRCF 的异常检测
  • 15 通过无监督和主动学习进行实用的白盒异常检测
  • 16 基于VAE和LOF的无监督KPI异常检测算法
  • 17 基于 VAE-LSTM 混合模型的时间异常检测
  • 18 USAD:多元时间序列的无监督异常检测
  • 19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测
  • 20 HotSpot:多维特征 Additive KPI 的异常定位
  • 21 Anomaly Transformer: 基于关联差异的时间序列异常检测
  • 22 Kontrast: 通过自监督对比学习识别软件变更中的错误
  • 23 TimesNet: 用于常规时间序列分析的时间二维变化模型
  • 24 TSB-UAD:用于单变量时间序列异常检测的端到端基准套件
  • 25 DIF:基于深度隔离林的异常检测算法
  • 26 Time-LLM:基于大语言模型的时间序列预测
  • 27 Dejavu: Actionable and Interpretable Fault Localization for Recurring Failures in Online Service Systems

相关:

  • VAE 模型基本原理简单介绍
  • GAN 数学原理简单介绍以及代码实践
  • 单指标时间序列异常检测——基于重构概率的变分自编码(VAE)代码实现(详细解释)

28. Unravel Anomalies: An End-to-end Seasonal-Trend Decomposition Approach for Time Series Anomaly Detection

论文名称:UNRAVEL ANOMALIES: AN END-TO-END SEASONAL-TREND DECOMPOSITION APPROACH FOR TIME SERIES ANOMALY DETECTION
会议名称:ICASSP 2024
论文地址:ieee | 阿里云盘 |
PPT 下载:https://sigport.org/sites/default/files/docs/TADNet%20Oral.pdf
源码地址:https://github.com/zhangzw16/TADNet

在这里插入图片描述

28.1 论文概述

论文很短(除去引用只有4页),我们可以很快地过一遍论文大体内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

28.2 相关技术

见原文第1节 New insights.

New insights:时间序列本质上由多个重叠模式组成:季节性、趋势和残差。这种重叠性质可能会掩盖不同类型的异常值。使用季节性-趋势分解(STD)的优势在图 1 中有生动的展示,它显示了如何通过将其分离为各自的成分来有效地分离异常值。通过利用 STD 的能力,我们的方法可以独特地分解这些复杂的复合模式。此外,根据文献[4] 提出的分类法,我们发现不同类型的数据异常都可以与相应的组件相关联:季节性异常与季节性成分、趋势异常与趋势成分以及点异常与剩余成分。
在这里插入图片描述
尽管现有研究已将时间序列分解纳入 TAD 任务,但这些方法并不遵循端到端的训练方式。具体而言,它们要么依赖于预定义的分解算法,需要精细的参数调整,要么仅将分解用于数据预处理。为了克服端到端训练缺乏监督信号的问题,我们引入了一种新的两步训练方法。最初,我们生成一个模拟真实世界数据分解成分的合成数据集。首先,我们在这个合成数据集上为分解任务预训练我们的模型。该模型随后根据真实世界的异常数据进行微调,从而增强时间序列分解和异常检测。

在这里插入图片描述
时间序列异常检测(Time-Series Anomaly Detection) 考虑一个长度为 T \mathcal{T} T 的时间序列数据集 T ∈ R T × D T \in \mathbb{R}^{\mathcal{T}\times D} TRT×D,当 D = 1 D=1 D=1 时称为单变量时间序列,当 D > 1 D>1 D>1 时称为多变量时间序列。TAD 任务的主要目标是在 T \mathcal{T} T 中识别异常,并生成输出序列 Y \mathcal{Y} Y Y \mathcal{Y} Y 中的每个元素对应于 T \mathcal{T} T 中相应数据点的异常状态,其中 1 表示异常。为此,使用基于点的方法(Point-wise score method)产生异常分数系列 S = { s 1 , s 2 , . . . , s m } S=\{s_1,s_2,...,s_m\} S={s1,s2,...,sm} ,其中 s i ∈ R s_i \in \mathbb{R} siR。然后通过独立阈值处理将这些分数转换为二进制异常标签 Y \mathcal{Y} Y

季节性趋势分解 (Seasonal-Trend Decomposition) 对于一个单变量时间序列 x ∈ R T x \in \mathbb{R}^\mathcal{T} xRT,它的结构成分包括趋势性和季节性,表示为 x t = τ t + s t + r t x_t=\mathcal{\tau}_t+s_t+r_t xt=τt+st+rt,其中 τ t \tau_t τt s t s_t st r t r_t rt 分别表示在第 t t t 个时间戳的趋势、季节性和剩余部分。

TAD 任务的方法的主要重点在于对单变量时间序列进行季节性-趋势分解。当前文献强调了评估每个变量以提高预测准确性的优点。因此,多元时间序列中的每个变量都会经历独立分解,而整体异常检测策略会考虑其多元本征特性。

时域音频分解(Time-domain Audio Separation):此任务可以描述为:给定混合的离散波形 x t ∈ R T x_t\in\mathbb{R}^{T} xtRT,对源数据 C \mathcal{C} C s t ( 1 ) , … , s t ( C ) ∈ R T s_t^{(1)},\ldots,s_t^{(C)}\in \mathbb{R}^{T} st(1),,st(C)RT) 进行评估时 。从数学上讲,这表示为 x t = ∑ i = 1 C s t ( i ) x_t=\sum_{i=1}^C s_t^{(i)} xt=i=1Cst(i)

单声道音频源分离领域已经通过各种深度学习模型取得了进展。TasNet 在此领域引入了端到端学习的概念。Conv-TasNet 通过集成卷积层进一步发展了这种方法。DPRNN 专注于通过循环神经网络改善长期建模。最近,像 SepFormer 这样的架构整合了注意力机制。

时域音频分离的理论框架与季节性趋势分解任务表现出惊人的相似性,从而使我们思考在这些领域之间可能的方法转换,以改进时间序列分解和异常检测。

28.3 核心方法

28.3.1 总体架构 Overall Framework

TADNet 的总体流程图如图 2 所示。预处理包括数据标准化 normalization 和分段(segmentation)。首先将输入数据被归一化到 [0,1) 范围内。分段采用长度为 P P P 的滑动窗口方法,将归一化的 T \mathcal{T} T 转换为长度为 P P P 的非重叠块(non-overlap blocks),表示为 D = X 1 , X 2 , … , X N \mathcal{D}={\mathcal{X}_1,\mathcal{X}_2,\ldots,\mathcal{X}_N} D=X1,X2,,XN。值得注意的是,虽然分段提供了更灵活的方法来管理较长的序列,但它不会影响结果。

在 TADNet 主干网中,我们利用TasNet架构及其语音(speech separation)分离的变体。将季节和趋势分量视为不同的音频信号,如图 2 所示,TasNet 有助于有效的 STD。

由于训练只使用正常样本,异常情况通常会破坏重构过程。为了检测这些异常值,我们计算重构误差,表示为 S c o r e ( t ) = ∥ T t , : − T t , : ∥ 2 Score(t) = \parallel \mathcal{T}_{t,:}-\mathcal{T}_{t,:} \parallel_2 Score(t)=∥Tt,:Tt,:2,其中 ∥ ⋅ ∥ 2 \parallel \cdot \parallel_2 2 表示 L2 范数。
在这里插入图片描述

28.3.2 TADNet 主要部分

编码器接受单变量时间序列 x d ∈ R P x_d\in\mathbb{R}^P xdRP,其中 d = 1 , 2 , … , D d=1,2,\ldots,D d=1,2,,D 来源于多元变量 X i \mathcal{X}_i Xi。它将该序列划分为多个重叠窗口(frames)。每个窗口具有长度 L L L,并且与相邻窗口重叠 S S S 个步长。然后按顺序将这些窗口合并为 X d ∈ R L × K \mathbf{X}_d\in\mathbb{R}^{L\times K} XdRL×K。通过随后的线性变换,编码器将 X d \mathbf{X}_d Xd映射到潜在空间 E = U X d \mathbf{E}=\mathbf{U}\mathbf{X}_d E=UXd。矩阵 U ∈ R N × L \mathbf{U} \in \mathbb{R}^{N\times L} URN×L 的行(rows) 包含可训练的转换基(transformation),而 E ∈ R N × K \mathbf{E} \in \mathbb{R}^{N\times K} ERN×K 表示输入时间序列在潜在空间中的特征表示。

分离器接收编码表示,并负责为分解的每个组件生成掩码(masks)。形式上表示为, { M T , M s , M r } = F sep ( E ; θ ) \{\mathbf{M_\mathcal{T}},\mathbf{M_\mathcal{s},\mathbf{M_\mathcal{r}}}\} = \mathcal{F}_{\text{sep}}(\mathbf{E;\theta}) {MT,Ms,Mr}=Fsep(E;θ) ,其中 M T \mathbf{M_\mathcal{T}} MT M s \mathbf{M_\mathcal{s}} Ms M r \mathbf{M_\mathcal{r}} Mr分别表示趋势、季节性和剩余成分的掩码。在这里, F sep \mathcal{F}_\text{sep} Fsep 表示分离子网络,可以使用各种架构如CNN,RNN或者Transformer 来实现。利用这些掩码,全局特征 E \mathbf{E} E 中每个目标的嵌入是:

E τ = M τ ⊙ E , E s = M s ⊙ E , E r = M r ⊙ E (1) \mathbf{E}_\tau=\mathbf{M}_\tau \odot \mathbf{E}, \quad \mathbf{E}_s=\mathbf{M}_s \odot \mathbf{E}, \quad \mathbf{E}_r=\mathbf{M}_r \odot \mathbf{E} \tag{1} Eτ=MτE,Es=MsE,Er=MrE(1)

通过相应掩模的逐点乘积来实现。

解码器架构镜像编码器,采用分离器生成的屏蔽嵌入。这些嵌入通过线性变换 V V V 被映射回时域。

S ^ τ = E τ T V , S ^ s = E s T V , S ^ r = E r T V (2) \hat{\mathbf{S}}_\tau=\mathbf{E}_\tau^T \mathbf{V}, \quad \hat{\mathbf{S}}_s=\mathbf{E}_s^T \mathbf{V}, \quad \hat{\mathbf{S}}_r=\mathbf{E}_r^T \mathbf{V} \tag{2} S^τ=EτTV,S^s=EsTV,S^r=ErTV(2)

这里, V ∈ R N × L V\in \mathbb{R}^{N \times L} VRN×L N N N 个解码器基 (decoder bases)。重构的趋势、季节性和余数,表示为 S ^ T \hat{\mathbf{S}}_\mathcal{T} S^T S ^ S \hat{\mathbf{S}}_\mathcal{S} S^S S ^ r \hat{\mathbf{S}}_\mathcal{r} S^r,是从它们各自的嵌入中导出的。输出时域信号通过重叠和相加运算(overlap-and-add operation)获得 T d ^ \hat{\mathcal{T}_d} Td^ s d ^ \hat{\mathcal{s}_d} sd^ r d ^ \hat{\mathcal{r}_d} rd^

28.3.3 合成数据集

在异常检测中,现实世界的数据通常缺乏 STD 所必需的微妙趋势和季节性模式。为了使 TADnet 具有鲁棒的 STD 能力,我们构建了一个合成数据集。该数据集经过精心设计,具有复杂的季节性和趋势变化、异常值和噪声,以模拟真实环境,如图 1 所示。确定性和随机趋势都被用来构造趋势和季节成分,然后对其进行归一化,以保持零均值和单位方差。

趋势(Trend) 确定性趋势使用具有固定系数的线性趋势函数生成: τ t ( d ) = β 0 + β 1 ⋅ t \tau^{(d)}_t=\beta_0 +\beta_1 \cdot t τt(d)=β0+β1t,其中 β 0 \beta_0 β0 β 1 \beta _{1} β1 是可调参数。 随机趋势成分通过 ARIMA (0,2,0) 过程进行建模,并按如下方式整合到趋势模型中:
τ t ( s ) = ∑ n = 1 t n X n \tau^{(s)}_{t} = \sum_{n = 1}^{t} n X _{n} τt(s)=n=1tnXn ,其中 X t X_t Xt 是服从正态分布的白噪声项,满足 Δ 2 τ t ( s ) = X t \Delta ^ {2} \tau^{(s)}_{t} = X_t Δ2τt(s)=Xt

周期性(Seasonal) 确定性的季节性成分结合了各种类型的周期信号。它包括振幅、频率和相位随时间变化的正弦波,以及振幅、周期和相位各不相同的方波。

对于缓慢变化的随机序列,季节性成分由重复的周期组成一个缓慢变化的趋势系列 τ t ( s ) \tau_t^{(s)} τt(s)。 这个系列是由趋势生成算法生成的,以确保在周期之间平滑过渡。 每个周期都由周期 T 0 T_0 T0 和相位 ϕ \phi ϕ 唯一地刻画出来。 随机季节性分量因此被定义为 s t = τ mod ( t + ϕ , T 0 ) ( s ) s_t = \tau^{(s)}_{\text{mod}(t+\phi,T_0)} st=τmod(t+ϕ,T0)(s)

为了丰富数据集,我们对周期长度和振幅进行了一些微调,包括重新采样单个周期并对周期内的值进行缩放,以实现更多样化和泛化的信号分解。

余项(Remainder) 通过使用具有可调方差的白噪声过程来定义余项部分。

为了增强分解模型对异常值的鲁棒性并确保稳定的分解性能,我们按照文献 [4] 中概述的方法向合成数据集中注入了部分异常值。

28.3.4 两阶段训练策略(Two-Phase Training Strategy)

我们为TADnet提出了一个两阶段训练策略,以确保其在时间序列分解和异常检测中的有效性。

在第一阶段,TADnet 在合成数据集上进行预训练,重点是时间序列分解。相应的损失函数由下列公式给出:

L d e c = ∑ d = 1 D ( ∥ τ d − τ ^ d ∥ 2 2 + ∥ s d − s ^ d ∥ 2 2 + ∥ r d − r ^ d ∥ 2 2 ) (3) L_{\mathrm{dec}}=\sum_{d=1}^D\left(\left\|\tau_d-\hat{\tau}_d\right\|_2^2+\left\|s_d-\hat{s}_d\right\|_2^2+\left\|r_d-\hat{r}_d\right\|_2^2\right) \tag{3} Ldec=d=1D(τdτ^d22+sds^d22+rdr^d22)(3)

这里, τ d \tau_d τd s d s_d sd r d r_d rd 分别表示第 d d d 维度的实际季节性、趋势性和残差分量,而 τ d \tau_d τd s d s_d sd r d r_d rd 则分别表示其预测值。

在第二阶段,使用一个真实的TAD数据集来微调TADnet。 这个阶段强调了在分解后准确重建原始时间序列,这是有效检测异常的关键要求。 该阶段的重点是整体重构精度的损失函数如下:

L r e c = ∑ d = 1 D ∥ x d − ( τ ^ d + s ^ d ) ∥ 2 2 (4) L_{\mathrm{rec}}=\sum_{d=1}^D\left\|x_d-\left(\hat{\tau}_d+\hat{s}_d\right)\right\|_2^2 \tag{4} Lrec=d=1Dxd(τ^d+s^d)22(4)

这里, x d x_d xd 表示在第 d d d 维上的原始时间序列, τ ^ d + s ^ d \hat{\tau}_d + \hat{s}_d τ^d+s^d 是其预测重构。

28.4 源码分析

源码地址为:https://github.com/zhangzw16/TADNet/tree/main

这里只对项目各个 .py 文件的功能概述:

  • pot:
    • constants.py 主要用于配置和初始化一个时间序列异常检测任务的参数;
    • pot.py 用于评估时间序列异常检测模型的性能,包括采用Point-Onset (POT) 方法进行异常检测,并计算相关的评估指标。
    • spot.py 实现了 SPOT 、 biSPOT、dSPOT、bidSPOT 四个算法,在 pot.py 文件中使用。
  • src:
    • data.py 数据读取与格式转换等,用于处理音频数据的PyTorch自定义数据集和数据加载器。
    • loss.py 损失函数、损失的计算相关函数;
    • mask.py 该函数用于在给定数组arr中随机选择一个长度为len0的子数组,并将该子数组用零填充,然后返回填充后的数组和选择的子数组的起始和结束位置。
    • models.py 模型核心相关内容,应用循环神经网络(RNN)和Sepformer进行音频信号处理。
    • preprocess.py 主要实现了对指定目录下的.npy文件进行预处理的功能
    • separate.py 一个使用FaSNet_base模型进行时间序列分离的程序。
    • solver.py 类用于训练和验证深度学习模型。它接收数据加载器、模型、优化器和参数,然后在多个epoch上执行训练和交叉验证。训练过程中,每过一定epoch会调整学习率,并保存最佳验证性能的模型。_run_one_epoch方法处理单个epoch的训练或验证,包括前向传播、计算损失和(在训练时)反向传播。
    • test.py 测试类
    • train.py 一个命令行接口,用于使用FaSNet_base模型进行时间序列异常检测网络的训练。
    • utils.py 相关工具类
  • synthetic:合成数据
    • anomaly.py 用于生成包含异常子信号的序列。类初始化时接受两个参数:amplitude表示序列的振幅,默认为1;type表示异常类型,可选值为’point’、‘interval’、‘contextual’、‘collective’、‘shapelet’、‘noise’。类中的generate方法接受一个时间序列作为输入,并根据设定的异常类型,在时间序列中添加相应的异常子信号,最后返回生成的异常序列。
    • const.py 相关参数常量。
    • generate.py 生成具有给定信息的完整序列。
    • main.py 这段代码主要实现了从给定的pk_info信息中生成时间序列数据,并将其分为趋势、噪声、季节性和完整序列四类,然后将这些序列保存到指定的文件夹中。
    • noise.py 用于生成具有给定振幅的噪声序列
    • season.py 周期性相关代码
    • trend.py 趋势性相关代码
  • run.py: 执行入口

28.5 Ablation Study (消融学习)

论文中提出的Ablation Study是一种系统性的实验方法,用于评估模型或算法中各个组成部分对整体性能的贡献。通过有选择地移除或替换模型的部分组件(例如,在TADNet模型中的Separator、Decomposition模块或数据增强预训练步骤),并观察模型性能的变化,特别是使用F1分数作为评价指标,研究者能够量化每个部分的重要性。

在TADNet的Ablation Study中,进行了以下实验:

  1. w/o Sep:移除了模型中的Separator(分隔器),导致所有数据集上的F1分数显著下降,显示了Separator在区分和处理时间序列复杂模式中的关键作用。

  2. w/o Decomp:将分解模块(Ldec)替换为一个简单的重建模块(Lrec),导致性能降低,强调了季节趋势分解在异常检测任务中的有效性。

  3. w/o Augment:省略了在合成数据集上的预训练步骤,降低了模型在所有数据集上的表现,证明了预训练对于提升模型在真实世界数据上的表现至关重要。

  4. Iterative:采用迭代训练方法,在分解和异常检测任务之间交替进行训练,虽然在特定数据集(如WADI)上提高了F1分数至92.06%,但考虑到增加的计算成本,作者选择了预训练-微调范式作为主要方法,并认为迭代训练的进一步探索可以留作未来工作。

通过这些Ablation Study,研究者不仅验证了TADNet各组成部分的有效性,而且为模型的优化和调整提供了指导,同时也为读者展示了如何在自己的研究中实施类似的实验来深入理解模型内部机制和组件的功能。

28.5 本章总结

论文提出了一种名为TADNet的模型,用于有效识别时间序列中的异常。该模型通过将复杂的时间序列数据分解为季节性、趋势和残差三个组成部分来简化分析,并与各类异常关联,从而提升检测性能。

TADNet采用两阶段训练策略。首先,在合成数据集上进行预训练,该数据集包含了模拟的季节性、趋势和残差组件,以及故意注入的异常数据以增强模型鲁棒性。预训练阶段的损失函数旨在最小化每个分解组件(季节性、趋势和残差)的均方误差。其次,模型在真实世界的时间序列异常检测(TAD)数据集上进行微调,重点是精确重构原始时间序列,这对于有效异常检测至关重要。此阶段的损失函数关注于整体重构精度。

论文还介绍了合成数据集中各组成部分的生成方法,如确定性季节性成分结合了不同幅度、频率和相位的正弦波及方波,慢变随机序列的周期性趋势则通过特定算法生成以确保周期间平滑过渡。此外,为了丰富数据集并提高信号分解的多样性和泛化能力,对周期长度和振幅进行了微调。

论文可以参考的地方

  1. 端到端季节趋势分解(STD):TADNet利用季节趋势分解将时间序列拆解成季节性、趋势和残余三个部分,这有助于单独分析和理解每个部分的异常,简化了复杂时间序列的分析过程。

  2. 两阶段训练策略:首先在合成数据集上预训练模型以学习如何有效地分解时间序列,然后在真实世界的异常检测数据集上微调,平衡了有效分解与精确异常检测的需求。这种策略可以作为新算法设计中数据处理和模型优化的重要参考。

  3. 合成数据集生成:论文中详细介绍了一种合成数据集的生成方法,包括慢变随机序列、包含各种周期信号的季节性组件以及残差组件的白噪声过程,甚至在其中注入异常数据以增强模型的鲁棒性。这种方法可以用来为新算法设计提供高质量的训练数据,尤其是在缺乏足够标注的真实数据情况下。

  4. Ablation Study:(详情请参考原论文 4.1节 Ablation Study )通过对模型不同组件(如分离器、分解模块、数据增强步骤和迭代训练策略)的消融实验,论文揭示了每个部分对模型性能的重要性。在设计新算法时,可以借鉴这些发现来决定哪些组件是必不可少的,以及它们如何影响最终性能。

  5. Reconstruction-based Anomaly Detection:(前面提到的 Donut / Bagel / LOF-VAE 等都是这类算法)通过计算重构误差来检测异常,该方法简单直观且有效。模型预测的重构误差与实际异常区域高度相关,表明这种方法能准确识别异常同时减少误报。

  6. 可解释性:TADNet不仅提高了检测准确性,还提供了清晰的分解可视化,使得结果具有更强的可解释性。新算法设计时考虑增强模型的解释能力,有助于用户理解和信任检测结果。

  7. 适应多变量时间序列:尽管主要针对单变量时间序列设计,TADNet也扩展到了多变量场景。虽然在某些复杂多变量情况下可能面临限制,但其框架为处理更广泛的数据类型提供了基础。

希望能帮到各位小伙伴 ~ 万分感谢各位的点赞、评论与关注支持 ~

在这里插入图片描述

Smileyan
2024.05.20 00:17

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

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

相关文章

TypeScript(持续更新中...)

1.TypeScript是什么? TypeScript是javaScript的超集。 2.使用TypeScript 1)全局安装nodejs 2)安装TypeScript编译器 npm i -g typescript 3.编译ts文件 //注意:需要在ts文件同级目录执行此命令,否则会报找不到…

Go语言(Golang)的开发框架

在Go语言(Golang)的开发中,有多种开发框架可供选择,它们各自具有不同的特点和优势。以下是一些流行的Go语言开发框架,选择Go语言的开发框架时,需要考虑项目需求、团队熟悉度、社区支持、框架性能和可维护性…

Java时间工具类(Date和LocalDateTime)

Date package com.qiangesoft.utils.date;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具类** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] C…

vue从入门到精通(四):MVVM模型

一,MVVM MVVM(Model–view–viewmodel)是一种软件架构模式。MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑(数据模型)的开发分离开来。详见MVVM 二,Vue中的MVVM Vue虽然没有完全遵循 MVVM 模型,但是 Vue 的设…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…

2024 电工杯高校数学建模竞赛(B题)| 平衡膳食食谱 |建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用负载均衡,多目标规划等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

【MySQL数据库】CRUD 增 删 改 查 超详解,有这一篇就够了!

​ ​ 🔥个人主页: 中草药 🔥专栏:【MySQL】探秘:数据库世界的瑞士军刀 目录 ⚗️一.CRUD 🧪二.新增(Create) 🧫1.基本操作 🧬2.使用SELECT插入 &#x…

169. Majority Element

文章目录 题目描述(简单难度)解法一解法二 位运算摩尔投票法参考文献 题目描述(简单难度) 给一个数组,存在一个数字超过了半数,找出这个数。 解法一 这种计数问题,直接就会想到 HashMap,遍历过程中统计每个数字出现的个数即可。…

Python入门全系列教程(更新中……)

最近辞职了,有点时间,打算写一套Python入门的全系列教程,需要的人欢迎关注蹲守!!! 【Python基础篇】:入门基础知识—轻松踏上编程巅峰!" 【Python基础篇】—基本语句详解 【Py…

jenkins插件之xunit

分析测试工具执行的结果,并图形化,比如phpunit,phpstan,可分析junit格式的结果 安装jenkins插件 搜索xunit并安装 项目配置 配置 - Build Steps 您的项目 - 配置 - Build Steps, 新增 Run with timeout 超时时间根据实际情况配置 Build…

unidbg入门笔记

一、unidbg 介绍 unidbg 是凯神 在 2019 年初开源的一个轻量级模拟器,一个基于Java的跨平台解密引擎,专门用于动态分析和逆向工程应用程序。它可以模拟不同CPU架构、操作系统和指令集,从而使用户能够在一个统一的环境中分析各种不同类型的二…

Mac下QT开发环境搭建详细教程

QT Qt是一个跨平台的C应用程序框架,用于开发具有图形用户界面(GUI)的应用程序,同时也可用于开发非GUI程序,比如控制台工具和服务器。Qt是设计成通用、可移植和高效的,它广泛应用于全球的企业和开发者社区中…

Codigger编码场景介绍(二):驾驶舱场景(Cockpit)

Codigger,一个专为开发人员设计的工具,致力于为不同的开发场景提供最佳的切换体验。Codigger囊括了多种场景,如传统场景、调试场景、设计器场景、驾驶舱场景以及纯净场景等。在上一篇文章中,我们介绍了传统场景模式,今…

宠物空气净化器:过敏星人的终极武器,让猫毛无处藏身~

猫毛过敏者虽畏惧猫毛,但对猫的热爱让他们选择继续养猫。过敏反应通常由猫的皮屑、唾液和尿液中的蛋白质引发,这些颗粒在空气中传播,导致打喷嚏、咳嗽和皮肤红疹等症状。宠物空气净化器,专为去除猫毛、异味和消毒灭菌设计&#xf…

【Vue3】env环境变量的配置和使用(区分cli和vite)

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、env文件二、vue3cli加载env1..env配置2..dev配置(其他环境参考)3.package.json文件4.使用 三、vue3vite加载e…

AI图片过拟合如何处理?答案就在其中!

遇到难题不要怕!厚德提问大佬答! 厚德提问大佬答8 你是否对AI绘画感兴趣却无从下手?是否有很多疑问却苦于没有大佬解答带你飞?从此刻开始这些问题都将迎刃而解!你感兴趣的话题,厚德云替你问,你解…

STM32-按键控制LED

接上篇LED点亮;http://t.csdnimg.cn/9r6z7 目录 一.硬件设计 二.软件设计 三.完整代码 四.结束语 一.硬件设计 按钮接电源插入PB0引脚,如上图所示 二.软件设计 void key_init() {GPIO_InitTypeDef GPIO_InitStruct;//使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19.1讲 串口格式化输出printf

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

JVM(5):虚拟机性能分析和故障解决工具概述

1 工具概述 作为一个java程序员,最基本的要求就是用java语言编写程序,并能够在jvm虚拟机上正常运行,但是在实际开发过程中,我们所有的程序由于各种各样的原因,并不是总能够正常运行,经常会发生故障或者程序…

cocos 写 连连看 小游戏主要逻辑(Ts编写)算法总结

cocos官方文档:节点系统事件 | Cocos Creator 游戏界面展示 一、在cocos编译器随便画个页面 展示页面 二、连连看元素生成 2.1、准备单个方块元素,我这里就是直接使用一张图片,图片大小为100x100,描点围为(0&#xf…