均值与方差计算

by luoshi006

均值方差 的数值计算方法。

在阅读 px4 代码时遇到了求取均值与方差的代码实现,比较优美:

https://github.com/PX4/ecl/blob/master/validation/data_validator.cpp#L88-L114

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 v j 表示样本中第 j 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 R M S = ∑ ( v n − m e a n n ) 2 n − 1

方差在统计中,分母为 n1 n − 1 ,是为了保证估计的无偏性。

//此处代码为 PX4 validator 代码:
_M2[i] += delta_val * (lp_val - _mean[i]);
_rms[i] = sqrtf(_M2[i] / (_event_count - 1));

此处,_M2[i] 的计算公式如下:

M2=(vnmn1)(vnmn)=(vnmn1)(vnmn1vnmn1n)=(n1n)(vnmn1)2(4)(5)(6) (4) M 2 = ( v n − m n − 1 ) ( v n − m n ) (5) = ( v n − m n − 1 ) ( v n − m n − 1 − v n − m n − 1 n ) (6) = ( n − 1 n ) ( v n − m n − 1 ) 2

时间仓促,此公式未查到出处,怀疑与下一行分母的 n1 n − 1 有关。

存疑,待查证。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值