Estoy buscando un buen algoritmo (es decir, cómputo mínimo, requisitos mínimos de almacenamiento) para estimar la mediana de un conjunto de datos que es demasiado grande para almacenar, de modo que cada valor solo se pueda leer una vez (a menos que almacene explícitamente ese valor). No hay límites en los datos que se puedan suponer.
Las aproximaciones están bien, siempre que se conozca la precisión.
Cualquier puntero?
algorithms
median
large-data
PeterR
fuente
fuente
Respuestas:
¿Podría agrupar el conjunto de datos en conjuntos de datos mucho más pequeños (digamos 100 o 1000 o 10,000 puntos de datos) Si luego calculó la mediana de cada uno de los grupos. Si hiciera esto con suficientes conjuntos de datos, podría trazar algo así como el promedio de los resultados de cada uno de los conjuntos más pequeños y esto, ejecutando suficientes conjuntos de datos más pequeños convergen en una solución 'promedio'.
fuente
¿Qué tal algo como un procedimiento de binning? Suponga (con fines ilustrativos) que sabe que los valores están entre 1 y 1 millón. Configure N contenedores, de tamaño S. Entonces, si S = 10000, tendría 100 contenedores, correspondientes a los valores [1: 10000, 10001: 20000, ..., 990001: 1000000]
Luego, recorre los valores. En lugar de almacenar cada valor, simplemente incremente el contador en el contenedor apropiado. Usando el punto medio de cada bin como una estimación, puede hacer una aproximación razonable de la mediana. Puede escalar esto a una resolución tan fina o gruesa como desee cambiando el tamaño de los contenedores. Estás limitado solo por la cantidad de memoria que tienes.
Dado que no sabe qué tan grandes pueden llegar a ser sus valores, simplemente elija un tamaño de contenedor lo suficientemente grande como para que no se le agote la memoria, utilizando algunos cálculos rápidos al final del sobre. También puede almacenar los contenedores escasamente, de modo que solo agregue un contenedor si contiene un valor.
Editar:
El enlace que proporciona ryfm da un ejemplo de esto, con el paso adicional de usar los porcentajes acumulativos para estimar con mayor precisión el punto dentro de la papelera mediana, en lugar de solo usar puntos medios. Esta es una buena mejora.
fuente
Te redirijo a mi respuesta a una pregunta similar . En pocas palabras, es un algoritmo de lectura única, 'sobre la marcha' con peor complejidad de caso para calcular la mediana (exacta).O(n)
fuente
El algoritmo Rivest-Tarjan-Selection (a veces también llamado algoritmo de mediana de medianas) le permitirá calcular el elemento mediano en tiempo lineal sin ningún tipo de clasificación. Para conjuntos de datos grandes, esto puede ser bastante más rápido que la clasificación logarítmica lineal. Sin embargo, no resolverá su problema de almacenamiento de memoria.
fuente
Implementé el algoritmo P-Square para el cálculo dinámico de cuantiles e histogramas sin almacenar observaciones en un módulo limpio de Python que escribí llamado LiveStats . Debería resolver su problema con bastante eficacia.
fuente
Nunca he tenido que hacer esto, así que esto es solo una sugerencia.
Veo dos (otras) posibilidades.
Datos medios
Distribución muestral
La otra opción es utilizar una aproximación que implique la distribución de muestreo. Si sus datos son normales, entonces el error estándar para n moderado es:
1.253 * sd / sqrt (n)
Para determinar el tamaño de n con el que estaría contento, ejecuté una simulación rápida de Montecarlo en R
Para n = 10000, el 15% de las estimaciones medias uniformes estaban fuera del IC.
fuente
Puede intentar encontrar una mediana basada en la distribución de frecuencia agrupada, aquí hay algunos detalles
fuente
Aquí hay una respuesta a la pregunta hecha en stackoverflow: https://stackoverflow.com/questions/1058813/on-line-iterator-algorithms-for-estimating-statistical-median-mode-skewness/2144754#2144754
La actualización iterativa mediana + = eta * sgn (muestra - mediana) parece que podría ser un camino a seguir.
fuente
El Algoritmo Remedian (PDF) proporciona una estimación mediana de una pasada con bajos requisitos de almacenamiento y precisión bien definida.
fuente
Si los valores que está utilizando están dentro de un cierto rango, digamos 1 a 100000, puede calcular eficientemente la mediana en un número extremadamente grande de valores (digamos, billones de entradas), con un cubo entero (este código tomado de BSD con licencia ea -utils / sam-stats.cpp)
fuente