2. 时序数据基础
在进入TinyML多变量时序异常检测项目之前,我们必须先建立对时序数据本身的深刻理解。时序数据是工业物联网、可穿戴设备、智能家居等场景中最常见的数据形态——温度、振动、电流、流量、心率等传感器信号,本质上都是随时间变化的观测值序列。本章将系统梳理时间序列的核心概念、三大成分(趋势、季节、噪声)的数学含义与工程意义,并重点剖析多变量时序数据与单变量数据的本质差异,以及在实际项目中如何对多变量时序数据进行规范化表示。这些基础将直接决定后续特征工程、模型选型与异常检测策略的有效性。
上图展示了本章的核心知识框架:时间序列由趋势、季节性和噪声三大成分叠加而成,而多变量时序数据则是在此基础上增加了变量维度之间的交互关系。表示方法的选择直接影响模型的计算效率与检测精度。下面我们将逐一深入展开。
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\) 个时间步的数据作为模型输入。
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算法)分离季节成分。但嵌入式环境计算资源有限,更实用的做法是:
- 对原始序列计算滑动平均,得到趋势估计 \(\hat{T}_t\);
- 从原始序列中减去趋势,得到去趋势序列 \(d_t = x_t - \hat{T}_t\);
- 对 \(d_t\) 按已知周期(如24小时)折叠平均,得到季节模板;
- 残差 \(N_t = x_t - \hat{T}_t - \hat{S}_t\) 即为噪声,用于计算正常波动范围。
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\) 个时间步的数据,每次新样本到达时覆盖最旧的数据。这种表示方式内存占用固定,适合实时推理。
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以下。
实际操作步骤:
- 在PC端用Python对采集的24小时正常数据做离线分析,确定每个变量的均值/标准差,以及正常工况下的相关系数范围。
- 将归一化参数以
const float数组形式固化到MCU Flash中。 - 在MCU上实现环形缓冲区,每次新采样到达时更新窗口,并滑动计算相关系数。
- 设定异常判定规则:若任一相关系数超出正常范围±0.3,且持续超过5个窗口,则触发报警。
结果对比与复盘:部署后,误报率从原来的每天3-4次降低到每周不到1次。同时,成功在气蚀发生初期(振动异常后2秒内)捕捉到相关系数突变。代价是增加了约15%的CPU占用(用于相关系数计算),但仍在STM32H7的预算内。复盘发现,窗口大小选择很关键:64个时间步(约0.64秒)既能平滑噪声,又不会过度延迟响应。
2.5 常见误区与总结复盘
误区一:忽视时间对齐。多变量数据各通道采样率不同(如振动1kHz、压力100Hz),若直接拼接原始数据,会导致时间错位。正确做法是降采样对齐到最低采样率,或使用插值法统一到同一时间网格。
误区二:将趋势当作异常。设备老化导致的缓慢趋势上升是正常现象,不应触发报警。应在预处理阶段去除趋势,只对残差部分进行异常检测。
误区三:忽略季节性的影响。许多工业过程具有日周期或班次周期。如果模型没有考虑季节性,同一时刻的“正常”值在不同季节可能差异很大。建议在特征中加入“时间戳”信息(如小时、星期几),或使用差分法消除已知周期。
误区四:内存布局不合理。在MCU上,多维数组的存储顺序(行优先 vs 列优先)会影响缓存命中率。对于滑动窗口计算,建议按“时间优先”存储(即 buffer[time][var]),这样在遍历时间步时内存访问连续。
| 常见误区 | 后果 | 正确做法 |
|---|---|---|
| 忽略采样率差异 | 特征错位,模型失效 | 重采样对齐到统一时间网格 |
| 未去除趋势 | 误报率升高 | 一阶差分或滑动平均去趋势 |
| 未处理季节性 | 同一时刻不同季节误判 | 加入时间特征或季节差分 |
| 数组存储顺序不当 | 计算效率低,内存访问慢 | 按时间连续存储 |
总结复盘:本章建立的时间序列基础框架——成分分解、多变量关联、规范化表示——是后续所有TinyML异常检测算法的基石。在实际项目中,建议按以下流程操作:① 离线分析历史数据,确定趋势、季节、噪声特性;② 设计合适的表示方法(矩阵/张量/流式);③ 在MCU上实现轻量级的预处理(归一化、去趋势);④ 验证多变量特征(如相关系数)对异常的可区分性。只有扎实掌握这些基础,才能在资源受限的嵌入式环境中构建可靠、高效的异常检测系统。