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)
升压功能没有被破坏.
问题是您没有为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分,它也能给出答案.
看来您调用了中位数两次。也许您打算第二次调用weighted_median?