нарушена взвешенная медиана Boost Library? - PullRequest
5 голосов
/ 25 февраля 2011

Признаюсь, я не эксперт в 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

Ответы [ 5 ]

5 голосов
/ 07 октября 2011

Функция повышения не нарушена.

Проблема в том, что вы не предоставляете достаточно данных для работы оценщика 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 баллов, как в вашем вопросе.

3 голосов
/ 25 февраля 2011

Что означает взвешенная медиана? Медиана учитывает только порядок элементов, а не содержание. Вес не меняет порядок (он может изменить среднее значение или сумму). Если бы вы использовали числа вхождений (натуральные целые числа) вместо чисел с плавающей точкой, вы могли бы расширить определение медианы, но я не думаю, что это то, что вы пытаетесь сделать здесь.

2 голосов
/ 25 февраля 2011

А как же:

accumulator_set<double, stats<tag::weighted_median(with_weighted_density) >, float> acc2;
1 голос
/ 26 февраля 2011

На основании документации говорится, что для вычисления медианы используется оценка P ^ 2.Я сделал поиск в Google и нашел Jain & Chlamtac " Алгоритм P ^ 2 для динамического вычисления квантилей и гистограмм без сохранения наблюдений ".К моему удивлению, мне кажется, что медиана Boost Accumulator является лишь приблизительной оценкой.Он должен был называться median_est вместо медианы.

И действительно, кажется, что взвешенная медиана нарушена;это не учитывает вес.

1 голос
/ 25 февраля 2011

Похоже, вы дважды вызываете медиану. Возможно, вы хотели вызвать weighted_median во второй раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...