《异常检测——从经典算法到深度学习》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
  • 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.mzph.cn/web/16966.shtml

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

相关文章

设计模式13——桥接模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式(Bridge&a…

冯喜运:5.27黄金短线看震荡,今日黄金原油走势分析

【黄金消息面分析】:黄金作为传统的避险资产,在经济不确定性中扮演着至关重要的角色。近期,国际黄金价格经历了显著的波动。从5月9日的低点2325.19美元/盎司反弹至2340美元/盎司以上,尽管金价曾一度触及2449.89美元/盎司的历史高点…

利用ESP32(Arduino IDE)向匿名上位机发送欧拉角

文章目录 一. 匿名上位机介绍二. 匿名协议说明1. 匿名协议官方说明文档2. 协议说明 三. 向匿名上位机发送数据(基于Arduino IDE的esp32)四. 运行效果 一. 匿名上位机介绍 匿名上位机官方介绍视频 匿名上位机官方下载 二. 匿名协议说明 1. 匿名协议官方说明文档 官方对于协…

现代 c++ 三:移动语义与右值引用

移动语义很简单,但它相关联的术语很复杂。本文尝试从历史的角度解释清楚这些乱七八糟的术语及其关联: 表达式 (expression)、类型(type)、值类别 (value categories); 左值 (lvalue)、右值 (rvalue)、广义左值 (glval…

Flink 数据源

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

5.2 Go 参数传递

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【傻呱呱】VirtualHere共享局域网中的USB设备(使用Pavadan老毛子固件搭建篇)

前期准备 SSH工具(FinalShell)老毛子固件路由器一台 搭建VirtualHere服务端 进入VirtualHere官网下载对应处理器架构的包,我的是RT-N14U-GPIO路由器刷的老毛子固件,这种一般选择最后一个或者倒数第二个包,这里我选择…

Transformers集成SwanLab实现AI训练可视化监控

🤗HuggingFace Transformers Hugging Face 的 Transformers 是一个非常流行的开源库,它提供了大量预训练的模型,主要用于自然语言处理(NLP)任务。这个库的目标是使最新的模型能够易于使用,并支持多种框架&…

Topogun 3 for Mac——您的专业三维模型处理利器

Topogun 3 for Mac,无疑是三维模型处理领域的翘楚。该软件不仅功能全面,而且操作简便,能够满足您对于三维模型处理的各种需求。 导入高模、视图操作、新建拓扑层,一切都在您的掌控之中。Topogun 3强大的自动拓扑功能,…

小猪APP分发:一站式免费应用推广的理想平台

在日益拥挤的移动应用市场中,对于独立开发者和新兴应用而言,找到一个高效且成本效益高的分发渠道至关重要。这正是小猪APP分发平台www.appzhu.cn脱颖而出的原因,它不仅提供了一个全面的解决方案,帮助开发者免费推广他们的应用程序…

家政预约小程序06服务展示

目录 1 首页展示2 团购详情总结 在家政小程序中,最重要的信息就是各项服务的内容。顾客通过服务的信息,了解家政公司可以提供什么样的服务以及相关的收费。本篇我们介绍一下服务展示功能如何开发。 1 首页展示 在首页我们已经开发了活动展示、服务分类展…

月入25000,因何焦虑?

遇到一位铁粉经常给我点赞评论,没勾兑之前还以为他赋闲在家,没想到收入很高,要是放在5年前相比很多人都不会这么焦虑,那个时候大环境很好,随便跳个槽收入至少能增长30%。 这位铁粉从事java开发,目前就职于某…

C++ 程序的基本要素

一 标识符 程序中变量、类型、函数和标号的名称称标识符。 a,b,name,int,char,main,void等。 系统已有的标识符称为关键字。 常见关键字 using,namespace,void,return; int,float,double,char,bool,signed,unsignex, long,short,const,true,false,sizeof if,else,for,do,whil…

统信UOS专业版操作系统如何安装惠普打印机驱动

通用集成驱动安装方法 以惠普P1566激光打印机为例介绍一下,在打印机管理器中选择打印机,手动选择安装驱动,找到品牌:惠普,型号:1566,安装驱动后测试打印;LaserJet Pro P1566 Foomati…

单细胞 10X 和seurat对象学习

单细胞seurat数据的基础知识 rm(list ls()) library(Seurat) #注意这个报错 #Warning: Feature names cannot have underscores (_), replacing with dashes (-) folderslist.files(./,pattern[123]$) folders scList lapply(folders,function(folder){ CreateSeuratObject(…

系统安全扫描扫出了:可能存在 CSRF 攻击怎么办

公司的H5在软件安全测试中被检查出可能存在 CSRF 攻击,网上找了一堆解决方法,最后用这种方式解决了。 1、问题描述 CSRF 是 Cross Site Request Forgery的缩写(也缩写为也就是在用户会话下对某个 CGI 做一些 GET/POST 的事,RIVTSTCNNARGO一这…

Transformer详解(4)-前馈层残差连接层归一化

1、前馈层 前馈层接收自注意力层的输出作为输入。 from torch import nn import torch.nn.functional as Fclass FeedForward(nn.Module):def __init__(self, d_model512, d_ff2048, dropout0.1):super().__init__()# d_ff 默认设置为2048self.linear_1 nn.Linear(d_model,…

CentOS 7安装prometheus

说明:本文介绍如何在CentOS操作系统上安装prometheus Step1:下载安装包 访问Github仓库,下载对应版本的prometheus安装包 https://github.com/prometheus/prometheus/releases 操作系统的版本信息,可通过下面这两个命令查看&am…

【UE Slate】 虚幻引擎Slate开发快速入门

目录 0 引言1 Slate框架1.0 控件布局1.1 SWidget1.1.1 SWidget的主要作用1.1.2 SWidget的关键方法1.1.3 使用SWidget创建自定义控件1.1.4 结论 1.2 SCompoundWidget1.2.1 SCompoundWidget的主要作用1.2.2 SCompoundWidget的使用示例1.2.3 SCompoundWidget的关系1.2.4 总结 1.3 …

Linux 磁盘管理命令tune2fs mkisofs cfdisk sfdisk parted

文章目录 3.Linux 磁盘管理命令3.26 tune2fs:文件系统调整案例练习 3.27 mkisofs:建立ISO9660 映象文件案例练习 3.28 cfdisk:磁盘分区案例练习 3.29 sfdisk:硬盘分区工具程序案例练习 3.30 parted:磁盘分区工具案例练习 3.Linux 磁盘管理命令 3.26 tune2fs:文件系统调整 作用…