4. 统计特征(二)

在TinyML特征工程中,基础统计特征(均值、方差、极值)往往只能刻画信号的宏观趋势,却难以捕捉信号波形的形态细节与分布特性。偏度、峰度、过零率、峰值因子、波形因子等高级统计特征,从概率分布形状、信号波动剧烈程度、波形陡峭度等维度提供了互补信息。这些特征计算量小、对微控制器资源友好,非常适合在传感器端实时提取。本节将系统讲解这些特征的定义、物理意义、计算方法及在TinyML中的典型应用场景。

高级统计特征体系与物理意义映射 传感器原始信号 偏度 (Skewness) 分布不对称方向 → 磨损/冲击/异常 峰度 (Kurtosis) 分布尖峭/平坦程度 → 冲击/间歇性故障 过零率 (ZCR) 信号穿越零点的频率 → 振动/语音/活动 峰值因子 (CF) 峰值与有效值之比 → 脉冲/冲击检测 波形因子 (FF) 有效值与整流均值之比 → 波形形状辨识 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项目中,高级统计特征的提取需要遵循标准化的流程,以确保特征的一致性和可比性。以下是推荐的五步操作流程:

  1. 数据预处理:去除直流分量(减去均值),消除传感器偏置影响;必要时进行带通滤波,保留感兴趣频段。
  2. 窗口划分:根据应用场景选择窗口长度(如128、256、512点),相邻窗口可重叠50%以平滑特征变化。
  3. 特征计算:按上述公式依次计算偏度、峰度、过零率、峰值因子、波形因子。注意使用浮点或Q15定点格式,避免溢出。
  4. 特征归一化:将各特征缩放到相同量纲(如0~1),防止数值范围差异影响后续分类器训练。
  5. 特征验证:通过可视化(如箱线图)或统计检验(如t检验)确认特征在不同类别间的区分度。
关键实现细节:在嵌入式C代码中,计算偏度和峰度时建议使用递推公式以避免大数溢出。例如,先计算均值μ,再计算二阶中心矩m2、三阶中心矩m3、四阶中心矩m4,最后得到偏度S = m3 / (m2^1.5),峰度K = m4 / (m2^2) - 3。使用float32类型时,需注意信号幅值范围,必要时先做归一化。

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 常见误区与总结复盘

误区一:忽视数据预处理。未去除直流分量时,偏度和峰度计算会严重失真。例如,加速度计存在0.1g的偏置时,偏度可能从0.3变为-0.8,导致误判。
误区二:窗口长度选择不当。窗口过短(<64点)导致特征方差过大,统计意义不显著;窗口过长(>1024点)则响应延迟,无法捕捉瞬态变化。
误区三:直接使用浮点运算。在无FPU的MCU上,float运算耗时是定点运算的5~10倍。建议使用CMSIS-DSP库的arm_mean_f32、arm_rms_f32等优化函数,或转换为Q15格式。
工程经验:在TinyML中,高级统计特征并非越多越好。建议先用少量样本做特征筛选,保留区分度高的特征(如通过计算类间距离)。此外,这些特征对采样率敏感——采样率翻倍时,过零率会显著变化,因此模型部署时的采样率必须与训练时一致。