使用滚动窗口大小提高累加器以进行百分位数统计

时间:2018-11-19 14:32:56

标签: c++ boost statistics boost-accumulators

我们使用升压累加器来计算服务器请求时间百分比,如下所示:

array([array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
   array([[[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]]]),
   array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])], dtype=float32)

新值插入如下:

array([array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
   array([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]]),
   array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])], dtype=object)

,百分数使用以下方法计算:

static constexpr size_t ROLLING_WINDOW_SIZE = 1000;
using accumulator_t = boost::accumulators::accumulator_set<long long int,
        boost::accumulators::stats<boost::accumulators::tag::extended_p_square_quantile,
                boost::accumulators::tag::rolling_count> >;
const std::array<double, 4> QUANTILE_PROBABILITIES = { 0.5, 0.75, 0.95, 0.99 };

....

Percentiles::Percentiles() :
    m_accumulator(boost::accumulators::extended_p_square_probabilities = QUANTILE_PROBABILITIES,
                  boost::accumulators::tag::rolling_window::window_size = ROLLING_WINDOW_SIZE) {}

我们看到的问题是,累加器实际上并没有真正计算指定滚动窗口大小上的分位数,而是将某些值保留了更长的时间,并将其用于计算。这就导致了这样一种情况,即在99_percentile快速增加(临时增加)之后,即使问题消失并且最近的1000个值看起来很好,它的恢复也非常缓慢。任何想法将不胜感激。

0 个答案:

没有答案