gpt4 book ai didi

c++ - Boost Library的加权中位数被打破了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:55 25 4
gpt4 key购买 nike

我承认我不是 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;
}

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

         Median: 0.3
Weighted Median: 0.3

我做错了什么吗?任何帮助将不胜感激。

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

@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;
}

结果是

         Sum: 2.1
Weighted Sum: 1.5

最佳答案

boost函数没有坏。

问题是您没有为 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.);
}

你得到了正确的结果

Median: 0.3
Weighted Median: 0.5

或者,您可以指定

 accumulator_set<double, 
stats<tag::weighted_median(with_p_square_cumulative_distribution) >,
double> acc2 ( p_square_cumulative_distribution_num_cells = 5 );

这给出了 Weighted Median: 0.55 作为答案,即使在您的问题中只添加了 6 分。

关于c++ - Boost Library的加权中位数被打破了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5111304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com