Pregunta

¿Cómo distribuyo una pequeña cantidad de datos en un orden aleatorio en un volumen de datos mucho mayor?

Por ejemplo, tengo varios miles de líneas de datos 'reales', y quiero insertar una docena o dos líneas de datos de control en un orden aleatorio en todos los datos 'reales'.

Ahora no estoy tratando de preguntar cómo usar generadores de números aleatorios, estoy haciendo una pregunta estadística, sé cómo generar números aleatorios, pero mi pregunta es cómo me aseguro de que los datos se inserten en un orden aleatorio mientras que al mismo tiempo se distribuye de manera bastante uniforme por el archivo.

Si solo confío en generar números aleatorios, existe la posibilidad (aunque sea muy pequeña) de que todos mis datos de control, o al menos grupos de ellos, se inserten dentro de una selección bastante limitada de datos 'reales'. ¿Cuál es la mejor manera de evitar que esto suceda?

Para expresarlo de otra manera, quiero insertar datos de control en mis datos reales sin que exista una forma para que un tercero calcule qué filas son de control y cuáles son reales.


Actualización: he hecho de esto un 'wiki de la comunidad', así que si alguien quiere editar mi pregunta para que tenga más sentido, adelante.
Actualización: Permítanme probar un ejemplo (no quiero hacer que este lenguaje o plataforma dependa, ya que no es una pregunta de codificación, es una pregunta estadística).

  • Tengo 3000 filas de datos 'reales' (esta cantidad cambiará de una ejecución a otra, dependiendo de la cantidad de datos que tenga el usuario).
  • Tengo 20 filas de datos de 'control' (nuevamente, esto cambiará dependiendo del número de filas de control que el usuario quiera usar, desde cero hacia arriba).

Ahora quiero insertar estas 20 filas de 'control' aproximadamente después de cada 150 filas o datos 'reales' (3000/20 = 150). Sin embargo, no quiero que sea tan preciso como eso, ya que no quiero que las filas de control sean identificables simplemente en función de su ubicación en los datos de salida.

Por lo tanto, no me importa que algunas de las filas de 'control' se agrupen o que haya algunas secciones con muy pocas o ninguna fila de 'control'. , pero generalmente quiero que las filas de 'control' se distribuyan de manera bastante uniforme en todos los datos.

¿Fue útil?

Solución

Siempre existe la posibilidad de que se acerquen si lo haces realmente al azar :)

Pero lo que haría es:

  1. Tiene N filas de datos reales y x de control data
  2. Para obtener un índice de una fila, debe insertar i -th fila de control, usaría: N / (x + 1) * i + r , donde r es un número aleatorio, diferente para cada una de las filas de control, pequeño en comparación con N / x . Elija cualquier forma de determinar r , puede ser distribución gaussiana o incluso plana . i es un índice de la fila de control, por lo que es 1<=i<x
  3. De esta manera puede estar seguro de evitar la condensación de sus filas de control en un solo lugar. También puede estar seguro de que no estarán a distancias regulares entre sí.

Otros consejos

Aquí está mi pensamiento. ¿Por qué no simplemente recorre las filas existentes y "lanza una moneda"? para cada fila para decidir si insertará datos aleatorios allí.

for (int i=0; i<numberOfExistingRows; i++)
{    
    int r = random();
    if (r > 0.5)
    {
        InsertRandomData();
    }    
}

Esto debería darle una buena distribución aleatoria a través de los datos.

Ir con las 3000 filas de datos reales y 20 filas de control para el siguiente ejemplo (soy mejor con el ejemplo que con el inglés)

Si distribuyera las 20 filas de control de la manera más uniforme posible entre las 3000 filas de datos reales, insertaría una en cada 150 filas de datos reales. Elija ese número, 150, para el próximo índice de inserción.
a) Genere un número aleatorio entre 0 y 150 y reste del índice de inserción
b) Inserte la fila de control allí.
c) Aumentar el índice de inserción en 150
d) Repita en el paso a)

Por supuesto, este es un algoritmo muy burdo y necesita algunas mejoras :)

Si los datos reales son grandes o mucho más grandes que los datos de control, solo genere intervalos entre llegadas para sus datos de control.

Así que elija un intervalo aleatorio, copie esa cantidad de líneas de datos reales, inserte datos de control, repita hasta que termine. ¿Cómo elegir ese intervalo aleatorio?

Recomiendo usar una desviación gaussiana con una media establecida al tamaño de datos real dividido por el tamaño de los datos de control, el primero de los cuales podría estimarse si fuera necesario, en lugar de medirse o asumirse que se conoce. Establezca la desviación estándar de este gaussiano en función de cuánto se extiende " Estás dispuesto a tolerar. Un stddev más pequeño significa una distribución más leptokurtic significa una adherencia más estricta al espaciado uniforme. Stdev más grande significa una distribución más platykurtic y una adherencia más flexible al espaciado uniforme.

Ahora, ¿qué pasa con la primera y la última sección del archivo? Es decir: ¿qué pasa con una inserción de datos de control al principio o al final? Una cosa que puede hacer es obtener estimaciones de casos especiales para estos ... pero un buen truco es el siguiente: comience su " índice " en los datos reales a menos la mitad de la media gaussiana y genera tu primer desvío. No envíe ningún dato real hasta su " índice " en los datos reales es de fiar. Un truco simétrico al final de los datos también debería funcionar bastante bien (simplemente: sigue generando desviaciones hasta que alcances un `` índice '' al menos la mitad de la media gaussiana más allá del final de los datos reales. Si el índice justo antes de esto estuviera desactivado al final, generar datos al final.

Desea ver más que solo estadísticas: es útil para desarrollar un algoritmo para este tipo de cosas para observar la teoría de colas rudimentaria. Ver wikipedia o el Turing Omnibus, que tiene un bonito y breve capítulo sobre el tema cuyo título es "Simulación".

Además: en algunas circunstancias, las distribuciones no gaussianas, particularmente la distribución de Poisson, dan resultados mejores y más naturales para este tipo de cosas. El esquema del algoritmo anterior todavía se aplica usando la mitad de la media de cualquier distribución que parezca correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top