使用相同的boost :: accumulator_set计算加权和未加权统计数据?

时间:2010-06-23 04:31:03

标签: c++ boost

使用Boost的累加器,我可以轻松计算统计量 加权或未加权的输入集。我想知道是否有可能混合加权 和同一累加器内的未加权量。看着 docs它似乎不是这样。

这编译得很好,但产生的结果比我想要的还要好:

using namespace boost::accumulators;

const double a[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};
const double w[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

accumulator_set<double, features<tag::sum, tag::weighted_sum>, double> stats;
for (size_t i=0; i<9; ++i)
  stats(a[i], weight = w[i]);

std::cout << sum(stats) <<" "<< weighted_sum(stats) << std::endl;
// outputs "75 75" instead of "13 75"

另外,我总是看到accumulator_set的第三个模板参数 获得加权数量,即使使用“未加权”功能和提取器:

accumulator_set<double, features<tag::sum>, double> stats;
for (size_t i=0; i<9; ++i)
  stats(a[i], weight = w[i]);
std::cout << sum(stats) << std::endl;
// outputs "75" instead of 13

如果我想计算两者,我是否总是必须使用两个不同的累加器 加权和未加权数量?

修改 我只是以sum为例,实际上我对多个更复杂的数量感兴趣。

1 个答案:

答案 0 :(得分:0)

确实在documentation中说

  

指定重量时,全部   集合中的累加器被替换   加权等价物。

可能有更好的方法可以做到这一点,但你可以尝试这样的事情(基本上用权重交换值的含义):

accumulator_set< double, stats< tag::sum, tag::sum_of_weights >, double > acc;
const double a[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};
const double w[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

   for( int i = 0; i < sizeof( a ) / sizeof( a[ 0 ] ); i++ )
      acc( w[ i ], weight = a[ i ] );

   std::cout << extract_result< tag::sum >( acc ) << std::endl; // weighted sum, prints 75
   std::cout << extract_result< tag::sum_of_weights >( acc ) << std::endl; // sum, prints 13