使用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
为例,实际上我对多个更复杂的数量感兴趣。
答案 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