利用标准差剔除异常数据

标准差公式是一种数学公式。标准差也被称为标准偏差,或者实验标准差,公式如下所示:标准差=方差的算术平方根=s=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/n)。

如是总体(即估算总体方差),根号内除以n(对应excel函数:STDEVP);

如是抽样(即估算样本方差),根号内除以(n-1)(对应excel函数:STDEV);

因为我们大量接触的是样本,所以普遍使用根号内除以(n-1)。

简单来说,标准差是一组数值自平均值分散开来的程度的一种测量观念。一个较大的标准差,代表大部分的数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。

例如,A、B两组各有6位学生参加同一次语文测验,A组的分数为95、85、75、65、55、45,B组的分数为73、72、71、69、68、67。这两组的平均数都是70,但A组的标准差为17.078分,B组的标准差为2.160分,说明A组学生之间的差距要比B组学生之间的差距大得多。

变化缓慢的场景中,利用标准差,可以过滤异常变化。例如在智能手表中,设备经常处于低功耗状态,一般间隔几分钟到几十分钟采集一次电池电压,如果采集电池电压时,马达震动提醒,由于马达功耗较高,造成电压跌幅比较大(停止震动后,电压会恢复)所以电池电量会出现跳变。此时利用标准差,可以发现此时标准差过大,抛弃此次数据,从而避免电池电量跳变。如若采用平均值滤波的方法(去除最高和最低值后求平均值)在采集到多个异常的场景无法剔除异常。

float calculate_sd(uint32_t *data_buff, uint32_t len)
{
    uint32_t total, i;
    float  variance, avg;

    total = 0;
    for(i=0; i<len; i++)
    {
        total += data_buff[i];
    }
    avg      = total / len; //计算平均值

    variance = 0;
    for(i=0; i<len; i++)
    {
        variance += pow((data_buff[i] - avg), 2);
    }
    variance /= len; //平方差

    return sqrt(variance); //标准差
}

  

 
posted @ 2019-03-27 21:53  摩羯兔有点冷  阅读(3727)  评论(0编辑  收藏  举报