时序数据基础:时间序列的概念、成分与多变量表示

在进入TinyML多变量时序异常检测项目之前,我们必须先建立对时序数据本身的深刻理解。时序数据是工业物联网、可穿戴设备、智能家居等场景中最常见的数据形态——温度、振动、电流、流量、心率等传感器信号,本质上都是随时间变化的观测值序列。本章将系统梳理时间序列的核心概念、三大成分(趋势、季节、噪声)的数学含义与工程意义,并重点剖析多变量时序数据与单变量数据的本质差异,以及在实际项目中如何对多变量时序数据进行规范化表示。这些基础将直接决定后续特征工程、模型选型与异常检测策略的有效性。

多变量时序数据表示与成分分解框架 时间序列 按时间顺序的观测值集合 三大成分 趋势 + 季节 + 噪声 多变量时序 多通道 + 维度间关联 表示方法 矩阵/张量/流 趋势 (Trend) • 长期上升/下降/平稳方向 • 可用线性/多项式/指数拟合 • 示例:设备老化导致温度缓慢升高 季节性 (Seasonality) • 固定周期重复模式 • 周期:日/周/月/年 • 示例:工厂用电量24小时周期波动 噪声 (Noise) • 随机不可预测成分 • 通常假设均值为0 • 示例:传感器电子热噪声 多变量时序数据的表示方法 矩阵表示:X ∈ R^(T×D),T为时间步数,D为变量维度 张量表示:批量数据 (B, T, D) 用于深度学习模型输入 流式表示:滑动窗口 (window_size, D) 用于实时检测

上图展示了本章的核心知识框架:时间序列由趋势、季节性和噪声三大成分叠加而成,而多变量时序数据则是在此基础上增加了变量维度之间的交互关系。表示方法的选择直接影响模型的计算效率与检测精度。下面我们将逐一深入展开。

2.1 时间序列的核心概念与数学定义

核心原理:时间序列(Time Series)是指按时间先后顺序排列的一组观测值,记为 \(\{x_t\}_{t=1}^T\),其中 \(t\) 表示离散时间索引,\(T\) 为序列长度。在TinyML场景中,时间索引通常对应等间隔采样时刻,例如每100ms采集一次加速度计数据。时间序列与普通随机样本的关键区别在于:相邻观测值之间存在时间依赖性,即 \(x_t\) 与 \(x_{t-1}, x_{t-2}, \dots\) 在统计上相关。这种自相关性(Autocorrelation)是时序分析的基础,也是异常检测算法能够“预测”正常模式的前提。

从概率视角看,时间序列可以视为随机过程的一个实现。对于多变量情况,我们定义 \(\mathbf{X} = [\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_T] \in \mathbb{R}^{D \times T}\),其中每一行代表一个变量(如温度、振动、电流),每一列代表一个时间点的观测向量。在TinyML项目中,由于内存和算力受限,我们通常不会处理完整的历史序列,而是采用滑动窗口机制,每次仅保留最近 \(W\) 个时间步的数据作为模型输入。

工程要点:在嵌入式设备上,时间序列的存储格式直接影响内存占用。例如,一个3轴加速度计以50Hz采样,每个轴16位整数,每秒产生 3×50×2 = 300 字节数据。若使用32位浮点数,则翻倍至600字节/秒。设计数据缓冲区时,应优先使用int16_t或int8_t等紧凑类型,并在必要时进行归一化缩放。

2.2 时间序列的三大成分:趋势、季节性与噪声

核心原理:经典的时间序列分解模型将观测值表示为三个成分的组合:

\(x_t = T_t + S_t + N_t\)(加法模型)或 \(x_t = T_t \times S_t \times N_t\)(乘法模型)

其中 \(T_t\) 为趋势成分,反映长期变化方向;\(S_t\) 为季节成分,呈现固定周期的波动;\(N_t\) 为噪声/残差成分,代表随机扰动。在工业异常检测中,理解这三个成分至关重要:异常往往表现为对趋势、季节或噪声模式的偏离。例如,轴承磨损会导致振动信号的趋势性上升;而传感器接触不良则表现为噪声方差突然增大。

成分数学特征典型周期工程示例异常检测意义
趋势 (T)单调或缓慢变化,可用线性/多项式拟合无固定周期电池电压随放电逐渐下降趋势突变可能表示器件失效
季节性 (S)固定周期重复,周期为s日、周、月、年工厂电力负荷24小时周期季节模式破坏可能表示工况异常
噪声 (N)随机、均值为零、方差稳定无周期ADC量化噪声、热噪声噪声方差增大可能表示干扰或故障

判断方法:在TinyML项目中,我们通常使用差分法去除趋势(一阶差分 \(x'_t = x_t - x_{t-1}\)),使用季节性分解(如STL算法)分离季节成分。但嵌入式环境计算资源有限,更实用的做法是:

  1. 对原始序列计算滑动平均,得到趋势估计 \(\hat{T}_t\);
  2. 从原始序列中减去趋势,得到去趋势序列 \(d_t = x_t - \hat{T}_t\);
  3. 对 \(d_t\) 按已知周期(如24小时)折叠平均,得到季节模板;
  4. 残差 \(N_t = x_t - \hat{T}_t - \hat{S}_t\) 即为噪声,用于计算正常波动范围。
经验提醒:在边缘设备上,不要试图在线运行完整的STL分解。更高效的做法是:在离线阶段用历史数据训练好趋势和季节的基线模型(例如存储每日同一时刻的均值与标准差),然后在设备端仅计算当前观测值与基线之间的偏差。这样既保留了成分信息,又大幅降低了计算量。

2.3 多变量时序数据的特点与维度间关联

核心原理:多变量时序数据(Multivariate Time Series, MTS)是指在同一时间点上同时记录多个物理量的序列集合。与单变量时序相比,MTS具有两个显著特点:维度内的时间依赖和维度间的空间/语义关联。例如,在电机监测中,电流、振动、温度三个变量并非独立变化——当负载增加时,电流上升、振动加剧、温度也随之升高。这种跨变量的协同变化模式,是单变量分析无法捕捉的。

多变量数据的表示方法:在TinyML项目中,常用的表示方式有三种:

  • 矩阵表示:将 \(T\) 个时间步、\(D\) 个变量组织为 \(T \times D\) 的矩阵,每一行是一个时间点的观测向量。这是最基础的存储格式,适合C语言中的二维数组。
  • 张量表示:当使用深度学习模型(如LSTM、Transformer)时,输入通常组织为 \((B, T, D)\) 的三维张量,其中 \(B\) 为批大小。在MCU上,\(B\) 通常为1,\(T\) 为窗口长度。
  • 流式表示:采用环形缓冲区(Ring Buffer)维护最近 \(W\) 个时间步的数据,每次新样本到达时覆盖最旧的数据。这种表示方式内存占用固定,适合实时推理。
风险提示:多变量数据的一个常见陷阱是变量间量纲差异。例如,温度范围可能在20-80°C,而振动加速度范围在0-5g。如果不进行归一化,模型会过度关注数值较大的变量,忽略数值较小但同样重要的变量。在TinyML中,推荐使用在线Z-score归一化:\(z = (x - \mu) / \sigma\),其中 \(\mu\) 和 \(\sigma\) 从历史窗口动态更新。

2.4 案例拆解:工业泵站的多变量监测数据表示

场景与约束:某水处理厂需要在一台STM32H7微控制器上部署异常检测模型,监测一台离心泵的运行状态。传感器包括:振动加速度计(3轴,采样率1kHz)、压力传感器(1路,采样率100Hz)、电机电流(1路,采样率50Hz)。设备内存仅512KB,Flash 2MB,要求检测延迟小于100ms。

初始现象与目标:传统单变量阈值报警频繁误报——因为泵在启动和停机阶段,各变量自然波动较大,但并非故障。目标是通过多变量联合分析,区分“正常工况变化”与“真实异常”(如气蚀、轴承磨损)。

关键输入数据与处理:

// 多变量数据缓冲区定义(环形缓冲区)
#define WINDOW_SIZE 64   // 时间窗口长度
#define NUM_VARS 5       // 变量数:acc_x, acc_y, acc_z, pressure, current

typedef struct {
    int16_t buffer[WINDOW_SIZE][NUM_VARS];  // 5×64×2字节 = 640字节
    uint8_t head;                            // 最新数据写入位置
} RingBuffer;

// 归一化参数(离线训练得到)
typedef struct {
    float mean[NUM_VARS];
    float std[NUM_VARS];
} NormParams;

分析判断过程:首先,对历史正常数据计算每个变量的均值与标准差。然后,将原始数据转换为Z-score。接着,计算窗口内各变量之间的皮尔逊相关系数矩阵(5×5),作为特征输入异常检测模型。正常工况下,振动与电流的相关系数稳定在0.6-0.8;当发生气蚀时,振动高频分量增加,但电流变化不大,导致相关系数骤降至0.2以下。

实际操作步骤:

  1. 在PC端用Python对采集的24小时正常数据做离线分析,确定每个变量的均值/标准差,以及正常工况下的相关系数范围。
  2. 将归一化参数以const float数组形式固化到MCU Flash中。
  3. 在MCU上实现环形缓冲区,每次新采样到达时更新窗口,并滑动计算相关系数。
  4. 设定异常判定规则:若任一相关系数超出正常范围±0.3,且持续超过5个窗口,则触发报警。

结果对比与复盘:部署后,误报率从原来的每天3-4次降低到每周不到1次。同时,成功在气蚀发生初期(振动异常后2秒内)捕捉到相关系数突变。代价是增加了约15%的CPU占用(用于相关系数计算),但仍在STM32H7的预算内。复盘发现,窗口大小选择很关键:64个时间步(约0.64秒)既能平滑噪声,又不会过度延迟响应。

案例总结:多变量时序表示的核心价值在于利用变量间的关联结构来区分正常波动与真实异常。在TinyML中,不必追求复杂的深度学习模型,简单的统计特征(如相关系数、协方差)配合合理的窗口设计,往往就能取得显著效果。

2.5 常见误区与总结复盘

误区一:忽视时间对齐。多变量数据各通道采样率不同(如振动1kHz、压力100Hz),若直接拼接原始数据,会导致时间错位。正确做法是降采样对齐到最低采样率,或使用插值法统一到同一时间网格。

误区二:将趋势当作异常。设备老化导致的缓慢趋势上升是正常现象,不应触发报警。应在预处理阶段去除趋势,只对残差部分进行异常检测。

误区三:忽略季节性的影响。许多工业过程具有日周期或班次周期。如果模型没有考虑季节性,同一时刻的“正常”值在不同季节可能差异很大。建议在特征中加入“时间戳”信息(如小时、星期几),或使用差分法消除已知周期。

误区四:内存布局不合理。在MCU上,多维数组的存储顺序(行优先 vs 列优先)会影响缓存命中率。对于滑动窗口计算,建议按“时间优先”存储(即 buffer[time][var]),这样在遍历时间步时内存访问连续。

常见误区后果正确做法
忽略采样率差异特征错位,模型失效重采样对齐到统一时间网格
未去除趋势误报率升高一阶差分或滑动平均去趋势
未处理季节性同一时刻不同季节误判加入时间特征或季节差分
数组存储顺序不当计算效率低,内存访问慢按时间连续存储

总结复盘:本章建立的时间序列基础框架——成分分解、多变量关联、规范化表示——是后续所有TinyML异常检测算法的基石。在实际项目中,建议按以下流程操作:① 离线分析历史数据,确定趋势、季节、噪声特性;② 设计合适的表示方法(矩阵/张量/流式);③ 在MCU上实现轻量级的预处理(归一化、去趋势);④ 验证多变量特征(如相关系数)对异常的可区分性。只有扎实掌握这些基础,才能在资源受限的嵌入式环境中构建可靠、高效的异常检测系统。