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

news2025/2/6 9:04:26

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

  • 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
  • 28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

相关:

  • 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

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

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

相关文章

[自动驾驶技术]-6 Tesla自动驾驶方案之硬件(AI Day 2021)

1 硬件集成 特斯拉自动驾驶数据标注过程中,跨250万个clips超过100亿的标注数据,无论是自动标注还是模型训练都要求具备强大的计算能力的硬件。下图是特斯拉FSD计算平台硬件电路图。 1)神经网络编译器 特斯拉AI编译器主要针对PyTorch框架&am…

网络上受认可的赚钱软件有哪些?这些兼职副业中总有一个适合你

在这个互联网迅速发展的时代,网络赚钱已经成为一种普遍的趋势。然而,你是否仍旧在依靠运气去碰寻赚钱的机会?是否还在为无法找到一个可靠的兼职平台而感到烦恼? 别担心,今天我将为你揭示那些真正可靠的在线赚钱平台&a…

算法简单笔记2

5月26号,之前学了两天算法烦了,去学了几天鸿蒙,今天又回来看一下算法,距离6月1日国赛还有6天,哈哈真是等死咯...... 一、蓝桥杯第13届国赛第1题填空题:重合次数 (半难不难,写编程难…

强化学习_06_pytorch-PPO2实践(Humanoid-v4)

一、PPO优化 PPO的简介和实践可以看笔者之前的文章 强化学习_06_pytorch-PPO实践(Pendulum-v1) 针对之前的PPO做了主要以下优化: -笔者-PPO笔者-PPO2refdata collectone episodeseveral episode(one batch)activationReLUTanhadv-compute-compute adv as one seri…

【Redis】持久化操作详解

Redis 持久化操作详解 Redis 实现持久化的时候,具体是按照什么样的策略来实现的呢? Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种&…

编程-辅助工具-Git下载

文章目录 1、前言2、Git官网地址3、迅雷下载 1、前言 采用Git能下载github上的代码,其下载是采用官网下载的,但是下载速度比较慢,网上也推荐了镜像的方式,但是有些链接失效了,突然有一天想起用迅雷是不是合适&#xf…

DDR基本原理

1. 简介 DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory,双数据率同步动态随机存储器)通常被我们称为DDR,其中的“同步”是指内存工作需要同步时钟,内部命令的发送与数据传输都以它为基准。DDR…

postman教程-4-发送post请求

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了postman发送get请求的方法,本小节我们讲解一下postman发送post请求的方法。 POST请求通常用于向服务器提交数据以创建新资源或执行某些操作。与GET请求不同,POST请求可…

华为机考入门python3--(31)牛客31-单词倒排

分类:字符串、正则 知识点: 正则提取所有符合的字符串 words re.findall(r[a-zA-Z], sentence) 列表倒序 words[::-1] 题目来自【牛客】 import re # 导入正则表达式模块def reverse_words(sentence):# 使用正则表达式将句子拆分成单词# 如可以将…

【Docker学习】详细讲解docker ps

docker ps是我们操作容器次数最多的命令之一,但我们往往使用docker ps或是docker ps -a,对于该命令的其它选项,我们关注比较少。那么这一讲,我给大家详细讲讲该命令的全部方法。 命令: docker container ls 描述&am…

python数据分析——apply 1

参考资料:活用pandas库 apply是指把函数同时作用于DataFrame的每一行或每一列。类似于编写一些跨每行或每列的for循环,并同时调用apply函数。 1、函数 函数是对python代码进行分组和复用的一种方法。如果某段代码会被多次使用,并且使用时是需…

Flink 数据源

原理 在 Flink 中,数据源(Source)是其中一个核心组件,负责从各种来源读取数据供 Flink 程序处理。 Flink 的数据源类型丰富,涵盖了从简单测试到生产环境使用的各种场景。Kafka、Socket、文件和集合是 Flink 中最常见…

[转载]同一台电脑同时使用GitHub和GitLab

原文地址:https://developer.aliyun.com/article/893801 简介: 工作中我们有时可能会在同一台电脑上使用多个git账号,例如:公司的gitLab账号,个人的gitHub账号。怎样才能在使用gitlab与github时,切换成对应…

利用边缘计算网关的工业设备数据采集方案探讨-天拓四方

随着工业4.0时代的到来,工业设备数据采集成为了实现智能制造、提升生产效率的关键环节。传统的数据采集方案往往依赖于中心化的数据处理方式,但这种方式在面对海量数据、实时性要求高的工业场景时,往往显得力不从心。因此,利用边缘…

访问构造方法(反射)

文章目录 前言一、反射是什么?二、访问构造方法 1.Constructor对象的获取方法2.Constructor方法的使用总结 前言 Java的反射机制可以实现访问、检测和修改Java对象本身信息的功能,在java.lang.reflect包下提供此功能。可以使程序员更加深入地控制程序的运…

初识C语言——第二十九天

数组 本章重点 1.一维数组的创建和初始化 数组的创建 注意事项: 1.一维由低数组在内存中是连续存放的! 2.随着数组下标的增长,地址是由低到高变化的 2.二维数组的创建和初始化 注意事项: 1.二维数组在内存中也是连续存放的&am…

内网横向移动小补充 --->PTK

大家别急,我的基于资源的约束性委派攻击还在写,这个东西一时半会讲不清楚,所以我在这里先来补充一点横向移动以前没说好的东西!!! 在更啦,别催啦~~~~ 还记得我之前在内网渗透里面讲过这个PTK&a…

2024爆款神器!会声会影2024旗舰版,让你的视频制作技能暴涨,不学真的亏大了!

在数字内容创作的时代,视频编辑已经成为连接创意与现实的重要桥梁。无论是个人Vlog制作、在线教育课程、企业宣传还是专业影视制作,高效而强大的视频编辑软件成为了必不可少的工具。会声会影2024旗舰版,作为一款集先进技术与用户友好界面设计…

数据集007:垃圾分类数据集(含数据集下载链接)

数据集简介 本数据拥有 训练集:43685张; 验证集:5363张; 测试集:5363张; 总类别数:158类。 部分代码: 定义数据集 class MyDataset(Dataset):def __init__(self, modetrain, …

【MATLAB】去除趋势项(解决频谱图大部分为零的问题)

1.概 述 在许多实际信号分析处理中信号经FFT变换后得到的频谱谱线值几乎都为0,介绍这是如何形成的,又该如何去解决。 2.案例分析 读入一组实验数据文件(文件名为qldata.mat),作出该组数据的频谱图。程序清单如下: clear; clc; close all;…