sirve secundaria que promedio ponderado ponderada para geometrica ejercicios ejemplos datos agrupados c++ boost statistics

c++ - secundaria - para que sirve la media ponderada



¿La mediana ponderada de Boost Library está rota? (5)

¿Qué se supone que significa la mediana ponderada? Una mediana considera solo el orden de los artículos, no el contenido. Un peso no cambia el orden (aunque puede cambiar la media o la suma). Si usó recuentos de ocurrencias (enteros naturales) en lugar de flotantes, podría extender la definición de la mediana, pero no creo que eso sea lo que está tratando de hacer aquí.

Confieso que no soy un experto en C ++.

Estoy buscando una forma rápida de calcular la mediana ponderada, que Boost parecía tener. Pero parece que no puedo hacer que funcione.

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

produce la siguiente salida, que es claramente incorrecta.

Median: 0.3 Weighted Median: 0.3

¿Estoy haciendo algo mal? Cualquier ayuda será apreciada.

* Sin embargo, la suma ponderada funciona correctamente *

@glowcoder: la suma ponderada funciona perfectamente así.

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

y el resultado es

Sum: 2.1 Weighted Sum: 1.5


Parece que llamas a la mediana dos veces. ¿Quizás querías llamar a weighted_median la segunda vez?


Qué pasa:

accumulator_set<double, stats<tag::weighted_median(with_weighted_density) >, float> acc2;


De acuerdo con la documentación, dice que usa el estimador P ^ 2 para calcular la mediana. Hice una búsqueda en Google y encontré Jain & Chlamtac " El algoritmo P ^ 2 para el cálculo dinámico de cuantiles e histogramas sin almacenar observaciones ". Para mi sorpresa, me parece que la mediana de Boost Acumulator es solo una estimación, no el valor exacto. Debería haber sido llamado median_est en lugar de mediana.

Y realmente parece como si la mediana ponderada estuviera rota; no toma en cuenta los pesos


La función de refuerzo no está rota.

El problema es que no proporciona suficientes datos para que el estimador P ^ 2 funcione. Si pones un círculo alrededor de tu entrada de datos, como

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.); }

obtienes el resultado correcto de

Median: 0.3 Weighted Median: 0.5

alternativamente, puede especificar

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

que da Weighted Median: 0.55 como respuesta incluso con solo 6 puntos agregados como en su pregunta.