1. 程式人生 > >均值與方差計算

均值與方差計算

by luoshi006

均值方差 的數值計算方法。

在閱讀 px4 程式碼時遇到了求取均值與方差的程式碼實現,比較優美:

for (unsigned i = 0; i < dimensions; i++) {
        if (_time_last == 0) {
            _mean[i] = 0;
            _lp[i] = val[i];
            _M2[i] = 0;
        } else {
            float lp_val = val[i] - _lp[i];

            float
delta_val = lp_val - _mean[i]; _mean[i] += delta_val / _event_count; _M2[i] += delta_val * (lp_val - _mean[i]); _rms[i] = sqrtf(_M2[i] / (_event_count - 1)); if (fabsf(_value[i] - val[i]) < 0.000001f) { _value_equal_count++; } else
{ _value_equal_count = 0; } } _vibe[i] = _vibe[i] * 0.99f + 0.01f * fabsf(val[i] - _lp[i]); // XXX replace with better filter, make it auto-tune to update rate _lp[i] = _lp[i] * 0.99f + 0.01f * val[i]; _value[i] = val[i]; }


對其分析如下:

以下公式中,約定 vj 表示樣本中第 j 個值。

平均值

(1)meann=v1+v2+...+vnn(2)=meann1(n1)+vnn(3)=meann1+vnmeann1n

即:

//此處程式碼為 PX4 validator 程式碼:
float delta_val = lp_val - _mean[i];
_mean[i] += delta_val / _event_count;

樣本方差

RMS=(vnmeann)2n1

方差在統計中,分母為 n1 ,是為了保證估計的無偏性。

//此處程式碼為 PX4 validator 程式碼:
_M2[i] += delta_val * (lp_val - _mean[i]);
_rms[i] = sqrtf(_M2[i] / (_event_count - 1));

此處,_M2[i] 的計算公式如下:

(4)M2=(vnmn1)(vnmn)(5)=(vnmn1)(vnmn1vnmn1n)(6)=(n1n)(vnmn1)2

時間倉促,此公式未查到出處,懷疑與下一行分母的 n1 有關。

存疑,待查證。