2008-10-09 21 views
5

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

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 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 esta información se inserte de forma aleatoria? orden mientras que al mismo tiempo se distribuye de manera bastante uniforme a través del archivo.

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

Para decirlo de otra manera, quiero insertar datos de control a lo largo de mis datos reales sin que haya una forma de 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: Déjame 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 ejecución a ejecución, dependiendo de la cantidad de datos que tenga el usuario).
  • Tengo 20 filas de datos de "control" (de nuevo, esto cambiará dependiendo del número de filas de control que el usuario quiera usar, cualquier cosa desde cero hacia arriba).

ahora desea insertar estos 20 'de control' filas aproximadamente después de cada 150 filas o datos 'real' ha sido insertada (3000/20 = 150). Sin embargo, no quiero que sea tan preciso 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 algunos de las filas de 'control' de ser agrupadas o para que haya algunos secciones con ninguna fila de 'control' en todos los muy pocos o, pero en general, quiero que el 'control' filas bastante uniformemente distribuidas a través de los datos.

+0

¿En qué contexto? ¿Esto está en una base de datos? Un archivo de texto sin formato? – ine

+0

Es un archivo de texto sin formato, en realidad tengo las filas en la memoria junto con las filas de control. Mientras escribo las filas "reales" para archivar, quiero poder decidir si debo escribir una fila de "control", con las filas de control distribuidas a lo largo de los datos reales y no todas agrupadas al principio o al final. – AnturCynhyrfus

Respuesta

3

Siempre hay una posibilidad de que se acercan el uno al otro si lo hace realmente al azar :)

Pero Lo que yo haría es:

  1. Usted tiene N filas de datos reales y x de de control de datos
  2. para obtener un índice de una fila debe insertar i -ésima fila de control, que haría uso: N/(x+1) * i + r, donde r es un número al azar, diversa para ea ch de las filas de control, pequeñas en comparación con N/x. Elija cualquier forma de determinar r, puede ser gaussiana o incluso distribución 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í.
+0

Seguramente eso significaría que si alguien pudiera identificar solo una fila de control, ¿podrían identificar todas las otras filas de control también? ¿Cuándo debo cambiar i y r, cada fila, cada vez que se inserta un nuevo control, o nunca? – AnturCynhyrfus

+0

r es un número aleatorio, diferente para cada fila de control – kender

+0

¡Oh, ya veo! Gracias por el comentario. – AnturCynhyrfus

0

Aquí está mi pensamiento. ¿Por qué no recorre las filas existentes y "lanza una moneda" para cada fila para decidir si va a 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 lo largo de los datos.

+0

Gracias por el comentario, el problema es que tengo mucho menos datos de control que los datos reales, por lo tanto, si uso un lanzamiento de moneda, insertaré todos mis datos al comienzo de los datos reales. – AnturCynhyrfus

0

Yendo a las 3000 filas de datos reales y 20 filas de control para el siguiente ejemplo (que estoy mejor con el ejemplo que con Inglés)

Si se va a propagar las 20 filas de control lo más uniformemente posible entre el 3000 filas de datos reales que insertaría una en cada 150a fila de datos reales. Por lo tanto, elija ese número, 150, para el siguiente índice de inserción.
a) Genere un número aleatorio entre 0 y 150 y restelo del índice de inserción
b) Inserte la fila de control allí.
c) aumento del índice de inserción por 150
d) Repetir en el paso a)

Por supuesto esto es un algoritmo muy crudo y que necesita unas pocas mejoras :)

+0

Hmmm, interesante, me gusta a dónde vas con eso. Trabajaré en algunas ideas basadas en sus sugerencias. Gracias. ;-) – AnturCynhyrfus

0

Si los datos real es grande o mucho más grande 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 finalice. ¿Cómo elegir ese intervalo aleatorio?

Recomendaría usar una desviación gaussiana con el promedio establecido en el tamaño de los datos reales dividido por el tamaño de los datos de control, el primero de los cuales podría estimarse si es necesario, en lugar de medirse o asumirse. Establezca la desviación estándar de este gaussiano en función de la cantidad de "propagación" que esté dispuesto a tolerar. Un stddev más pequeño significa que una distribución más leptocúrtica significa una adherencia más estricta al espaciado uniforme. Un stdev más grande significa una distribución más platykurtic y una adherencia más flexible al espaciado uniforme.

¿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 crear 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 genere su primer desvío. No envíe datos reales hasta que su "índice" en los datos reales sea legítimo. Un truco simétrico al final de los datos también debería funcionar bastante bien (simplemente: siga generando desviaciones hasta que llegue a un "índice" de al menos la mitad del promedio gaussiano más allá del final de los datos reales. al final, genere datos al final.

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

También: en algunas circunstancias las distribuciones no gaussianas, particularmente la distribución de Poisson, dan mejores resultados, más naturales para este tipo de cosas. sigue siendo aplicable usar la mitad de la media de cualquier distribución que parezca correcta.