4. 统计特征(二)
在TinyML特征工程中,基础统计特征(均值、方差、极值)往往只能刻画信号的宏观趋势,却难以捕捉信号波形的形态细节与分布特性。偏度、峰度、过零率、峰值因子、波形因子等高级统计特征,从概率分布形状、信号波动剧烈程度、波形陡峭度等维度提供了互补信息。这些特征计算量小、对微控制器资源友好,非常适合在传感器端实时提取。本节将系统讲解这些特征的定义、物理意义、计算方法及在TinyML中的典型应用场景。
4.1 核心原理:从分布形状到波形形态的多维刻画
高级统计特征的核心思想是:用少量数值描述信号概率分布的形状和波形的时间结构。与均值、方差等一阶二阶矩不同,这些特征对信号中的非线性、非高斯成分更敏感,能够揭示传感器数据中隐藏的模式变化。
| 特征名称 | 数学定义 | 物理意义 | 典型取值范围 |
|---|---|---|---|
| 偏度 (Skewness) | \( S = \frac{1}{N}\sum_{i=1}^{N}(\frac{x_i-\mu}{\sigma})^3 \) | 分布不对称的方向和程度 | 负值:左偏;正值:右偏;0:对称 |
| 峰度 (Kurtosis) | \( K = \frac{1}{N}\sum_{i=1}^{N}(\frac{x_i-\mu}{\sigma})^4 - 3 \) | 分布尾部的厚度和峰值尖峭程度 | 0:正态分布;正值:尖峰厚尾;负值:平峰 |
| 过零率 (ZCR) | \( ZCR = \frac{1}{N-1}\sum_{i=1}^{N-1} \mathbb{1}(x_i x_{i+1} < 0) \) | 信号穿越零点的频率,反映波动快慢 | 0~0.5(归一化后),语音中约0.02~0.15 |
| 峰值因子 (CF) | \( CF = \frac{|x|_{peak}}{x_{rms}} \) | 信号峰值相对于有效值的突出程度 | 正弦波:1.414;脉冲信号:>3 |
| 波形因子 (FF) | \( FF = \frac{x_{rms}}{(1/N)\sum|x_i|} \) | 波形形状的“饱满度” | 正弦波:1.11;方波:1.0;脉冲:>1.5 |
在TinyML场景中,这些特征的计算复杂度均为O(N),仅需一次遍历即可完成,非常适合在Cortex-M系列等低功耗MCU上实时运行。例如,在STM32L4上计算256点窗口的偏度和峰度,仅需约15μs(主频80MHz),远低于传感器采样间隔。
4.2 判断方法与操作流程:特征提取的工程化步骤
在实际TinyML项目中,高级统计特征的提取需要遵循标准化的流程,以确保特征的一致性和可比性。以下是推荐的五步操作流程:
- 数据预处理:去除直流分量(减去均值),消除传感器偏置影响;必要时进行带通滤波,保留感兴趣频段。
- 窗口划分:根据应用场景选择窗口长度(如128、256、512点),相邻窗口可重叠50%以平滑特征变化。
- 特征计算:按上述公式依次计算偏度、峰度、过零率、峰值因子、波形因子。注意使用浮点或Q15定点格式,避免溢出。
- 特征归一化:将各特征缩放到相同量纲(如0~1),防止数值范围差异影响后续分类器训练。
- 特征验证:通过可视化(如箱线图)或统计检验(如t检验)确认特征在不同类别间的区分度。
4.3 案例拆解:旋转机械轴承故障的TinyML诊断
背景与约束:某工业设备厂商需要在振动传感器节点上实现轴承状态监测,MCU为STM32L4(80MHz,64KB RAM),采样率4kHz,窗口长度256点,要求特征提取耗时小于1ms,分类准确率不低于95%。
初始现象与目标:轴承正常时振动信号近似高斯分布;发生点蚀故障时,信号中出现周期性冲击脉冲,分布呈现尖峰厚尾特征。目标是通过高级统计特征区分正常、点蚀、磨损三种状态。
关键输入数据:采集三组振动信号各100个窗口,计算每个窗口的5个高级统计特征。部分典型值如下:
| 状态 | 偏度 | 峰度 | 过零率 | 峰值因子 | 波形因子 |
|---|---|---|---|---|---|
| 正常 | -0.02 ± 0.05 | 0.1 ± 0.2 | 0.12 ± 0.01 | 1.8 ± 0.2 | 1.15 ± 0.03 |
| 点蚀 | 0.35 ± 0.15 | 3.8 ± 1.2 | 0.09 ± 0.02 | 4.2 ± 0.8 | 1.35 ± 0.10 |
| 磨损 | -0.15 ± 0.08 | 1.5 ± 0.4 | 0.15 ± 0.02 | 2.5 ± 0.3 | 1.22 ± 0.05 |
分析判断过程:从数据可见,峰度和峰值因子对点蚀故障最敏感(分别从0.1→3.8和1.8→4.2),因为冲击脉冲使分布尾部变厚、峰值突出。偏度从接近0变为正值,表明冲击方向偏向正半轴。过零率在点蚀时下降,因为冲击脉冲使信号在局部保持同号。
实际操作步骤:
// 伪代码:TinyML端特征提取
void extract_features(float32_t* window, uint16_t len, float* feat) {
float mean = 0, rms = 0, peak = 0, zcr = 0;
float m2 = 0, m3 = 0, m4 = 0;
// 第一遍:计算均值、峰值、过零率
for (int i = 0; i < len; i++) {
mean += window[i];
if (fabs(window[i]) > peak) peak = fabs(window[i]);
if (i > 0 && (window[i] * window[i-1] < 0)) zcr++;
}
mean /= len;
zcr /= (len - 1);
// 第二遍:计算中心矩
for (int i = 0; i < len; i++) {
float d = window[i] - mean;
m2 += d*d;
m3 += d*d*d;
m4 += d*d*d*d;
}
m2 /= len; m3 /= len; m4 /= len;
float std = sqrt(m2);
feat[0] = m3 / (std*std*std); // 偏度
feat[1] = m4 / (m2*m2) - 3.0f; // 峰度
feat[2] = zcr; // 过零率
feat[3] = peak / sqrt(m2); // 峰值因子
feat[4] = sqrt(m2) / (mean_abs(window, len)); // 波形因子
}
结果对比与复盘:使用5个特征训练决策树模型(最大深度4),测试准确率达97.2%,满足要求。特征重要性排序为:峰度(0.42) > 峰值因子(0.28) > 偏度(0.15) > 波形因子(0.10) > 过零率(0.05)。若仅使用均值+方差,准确率仅82%,说明高级统计特征显著提升了诊断能力。风险点在于:当转速变化时,峰度和峰值因子会受影响,需在训练数据中包含不同转速工况。
4.4 常见误区与总结复盘
误区二:窗口长度选择不当。窗口过短(<64点)导致特征方差过大,统计意义不显著;窗口过长(>1024点)则响应延迟,无法捕捉瞬态变化。
误区三:直接使用浮点运算。在无FPU的MCU上,float运算耗时是定点运算的5~10倍。建议使用CMSIS-DSP库的arm_mean_f32、arm_rms_f32等优化函数,或转换为Q15格式。