|
一维数据的均值和方差计算可以说是几乎是最常用的统计分析方法。这个初中就学过的概念,在嵌入式系统中却有着广泛的实际应用:
传感器故障检测正常工作的传感器数据波动应在一定范围内突然的均值漂移或方差剧变,往往意味着传感器故障如温度传感器读数突然剧烈波动,很可能是接触不良
信号质量评估 GPS信号强度的均值和方差可以反映定位质量 方差过大说明信号不稳定,可能处于多路径效应区域均值过低说明信号较弱,可能在遮挡环境下
机器人控制舵机位置反馈的方差可以用来检测是否卡死电机电流的均值可以估计负载大小轮速反馈的方差可以判断地面情况
电池管理电压的滑动均值可以平滑瞬时波动电流的方差可以反映负载的稳定性温度的异常波动可能预示电池问题
这些场景都需要实时、高效地计算数据流的统计特征。虽然计算公式简单,但在实际工程中,有限的资源限制及实时性要求、数值稳定性和存储效率成为主要挑战。本文主要探讨如何在有限的计算能力和内存条件下,优雅地实现高效的均值和方差计算。通过优化算法、减少计算复杂度、利用递推公式和定点数运算,文章提供了一系列使用技巧,帮忙开发者在保持精度的同时,显著降低计算开销。这些方法特别适用于物联网设备、嵌入式系统等对资源敏感的领域。
基础知识
1.1 定义
众所周知: 均值(mean)反映数据的集中趋势:
方差(variance)反映数据的离散程度:
基于以上两个定义式出发,可以很简单的转换为C code, 浅显易懂:
使用示例:
但是这种最基础的实现存在几个严重问题:
1) 数据存储问题 需要保存全部历史数据对于高频采样的传感器(如IMU 200Hz),1s就需要存储200个数据点在嵌入式系统中,内存资源宝贵,这种方式极其浪费2)计算效率问题 每次计算都需要遍历全部数据,时间复杂度为O(n)对于实时系统,随着数据量增加,计算延迟会越来越大不适合需要快速响应的实时控制系统3)数值稳定性问题 直接累加可能导致数值溢出对于很大或很小的数据,浮点数精度损失明显特别是在计算方差时,(Xi-u)的计算可能产生很大的舍入误差4)实时性问题无法进行增量计算新数据到来时需要重新计算所有统计量不适合流数据处理在线算法(Online Algorithm)
在线方法也叫做流式方法, 针对批量方法的缺点,在线方法不需要保存历史数据,在线算法中比较经典的是 Welford算法。Welford算法是由B.P. Welford在1962年提出的一种在线计算均值和方差的算法。它的核心思想是:每来一个新数据,就递增地更新均值和方差,而不需要存储所有历史数据。
2.1 Welford算法 这是一种数值稳定的在线算法,特别适合处理数据流。Welford算法的核心是递推公式的推导。设第n个数据到来时:
1) 均值更新
2) 方差更新:
3) 关键推导步骤:
2.2 Welford算法实现2.2.1 核心结构和函数
2.2.2 使用示例
2.2.3 算法步骤解释1) 每次新数据到来:
计数加1计算新数据与当前均值的差更新均值更新M2(用于方差计算)2) 方差计算:直接用M2除以样本数样本数小于2时返回0算法对比小结
本文介绍了Welford方差计算方法,它是一种在线、一次遍历的方差计算算法,能在不存储所有样本的情况下,逐步计算所有样本的方差。与传统的方差计算方法相比,Welford方法在降低访存次数的同时,也做到了数值计算的稳定性。因此,Welford方法更适合处理海量数据,也更适合在高性能计算环境中使用。事实上,Welford算法启发了 NVIDIA 在2018年提出的Online Softmax算法,该算法降低了Softmax计算的访存次数,提高了计算性能。而Online Softmax则直接启发了FlashAttention,后者已经成为支撑当前最流行的Transformer架构的最核心的计算优化手段。
|
|