是Boost Library的加权中位数被打破了吗?

San*_*ang 5 c++ statistics boost

我承认我不是C++的专家.

我正在寻找一种快速计算加权中位数的方法,Boost似乎有.但似乎我无法使其发挥作用.

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/median.hpp>
#include <boost/accumulators/statistics/weighted_median.hpp>
using namespace boost::accumulators;    

int main()
{
  // Define an accumulator set
  accumulator_set<double, stats<tag::median > > acc1;
  accumulator_set<double, stats<tag::median >, float> acc2;

  // push in some data ...
  acc1(0.1);
  acc1(0.2);
  acc1(0.3);
  acc1(0.4);
  acc1(0.5);
  acc1(0.6);

  acc2(0.1, weight=0.);
  acc2(0.2, weight=0.);
  acc2(0.3, weight=0.);
  acc2(0.4, weight=1.);
  acc2(0.5, weight=1.);
  acc2(0.6, weight=1.);

  // Display the results ...
  std::cout << "         Median: " << median(acc1) << std::endl;
  std::cout << "Weighted Median: " << median(acc2) << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出,这显然是错误的.

         Median: 0.3
Weighted Median: 0.3
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?任何帮助将不胜感激.

*但是,加权和正常工作*

@glowcoder:加权和完全正常.

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/sum.hpp>
#include <boost/accumulators/statistics/weighted_sum.hpp>
using namespace boost::accumulators;

int main()
{
  // Define an accumulator set
  accumulator_set<double, stats<tag::sum > > acc1;
  accumulator_set<double, stats<tag::sum >, float> acc2;
  // accumulator_set<double, stats<tag::median >, float> acc2;

  // push in some data ...
  acc1(0.1);
  acc1(0.2);
  acc1(0.3);
  acc1(0.4);
  acc1(0.5);
  acc1(0.6);

  acc2(0.1, weight=0.);
  acc2(0.2, weight=0.);
  acc2(0.3, weight=0.);
  acc2(0.4, weight=1.);
  acc2(0.5, weight=1.);
  acc2(0.6, weight=1.);

  // Display the results ...
  std::cout << "         Median: " << sum(acc1) << std::endl;
  std::cout << "Weighted Median: " << sum(acc2) << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是

         Sum: 2.1
Weighted Sum: 1.5
Run Code Online (Sandbox Code Playgroud)

han*_*nes 5

升压功能没有被破坏.

问题是您没有为P ^ 2估算器提供足够的数据.如果您在数据输入周围放置一个循环,例如

for(int i=0;i<100000;i++){
  acc2(0.1, weight=0.);
  acc2(0.2, weight=0.);
  acc2(0.3, weight=0.);
  acc2(0.4, weight=1.);
  acc2(0.5, weight=1.);
  acc2(0.6, weight=1.);
}
Run Code Online (Sandbox Code Playgroud)

你得到了正确的结果

Median: 0.3
Weighted Median: 0.5
Run Code Online (Sandbox Code Playgroud)

或者,您可以指定

 accumulator_set<double, 
    stats<tag::weighted_median(with_p_square_cumulative_distribution) >, 
    double> acc2 ( p_square_cumulative_distribution_num_cells = 5 );
Run Code Online (Sandbox Code Playgroud)

Weighted Median: 0.55即使你的问题中只增加了6分,它也能给出答案.


cor*_*iKa 1

看来您调用了中位数两次。也许您打算第二次调用weighted_median?

  • 谢谢,但文档说如果权重非空,则计算是使用加权对应项完成的。http://www.boost.org/doc/libs/1_42_0/doc/html/accumulators/user_s_guide.html#accumulators.user_s_guide.the_accumulators_framework.weighted_samples (2认同)