均值與方差計算
阿新 • • 發佈:2019-01-01
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];
}
對其分析如下:
以下公式中,約定 表示樣本中第 個值。
平均值
即:
//此處程式碼為 PX4 validator 程式碼:
float delta_val = lp_val - _mean[i];
_mean[i] += delta_val / _event_count;
樣本方差
方差在統計中,分母為 ,是為了保證估計的無偏性。
//此處程式碼為 PX4 validator 程式碼:
_M2[i] += delta_val * (lp_val - _mean[i]);
_rms[i] = sqrtf(_M2[i] / (_event_count - 1));
此處,_M2[i] 的計算公式如下:
時間倉促,此公式未查到出處,懷疑與下一行分母的 有關。