利用標准差剔除異常數據


標准差公式是一種數學公式。標准差也被稱為標准偏差,或者實驗標准差,公式如下所示:標准差=方差的算術平方根=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); //標准差
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM