2010-11-04 16 views
10

Estoy seguro de que se ha preguntado lo contrario muchas veces, pero no he podido encontrar ninguna respuesta sobre cómo generar números aleatorios incorrectos.Cómo generar números aleatorios erróneos

Quiero escribir un pequeño programa para el análisis de clúster y quiero generar algunos puntos aleatorios para la prueba. Si simplemente insertara 1000 puntos con coordenadas aleatorias, se dispersarían por todo el campo, lo que haría que un análisis de conglomerados careciera de valor.

¿Hay una manera simple de generar números aleatorios que crean clusters?

Ya he pensado en no usar random() pero random()*random() que genera números normalmente distribuidos (creo que he leído esto en algún lugar aquí en Stack Overflow).

El segundo enfoque sería elegir algunas áreas al azar y ejecutar nuevamente la generación de puntos en esta área, lo que, por supuesto, produciría un clúster en esta área.

¿Tiene una mejor idea?

+0

Lo que dijo: decidir en cada una distribución o racimos y generar números aleatorios usando eso como la función de densidad de probabilidad. –

+7

Me recuerda a http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318.strip.gif – Gumbo

+0

Supongo que estás hablando de esta pregunta: http: //stackoverflow.com/questions/3956478/understanding-randomness cuando se habla de 'random() * random()' –

Respuesta

7

Si desea producir deliberadamente agrupaciones bien formados (en lugar de racimos completamente al azar), se podría combinar los dos para encontrar un centro de clúster, y luego poner un montón de puntos alrededor de ella en una distribución normal.

Además de trabajar en coordenadas cartesianas (x, y); podría usar un método radial para distribuir puntos para un grupo en particular. Elija un ángulo aleatorio (0-2PI radianes), luego elija un radio. Tenga en cuenta que, como la circunferencia es un radio proporcional, la distribución del área será más densa cerca del centro, pero la distribución por radio específico será la misma. Modifique la distribución radial para producir un clúster más compacto.

O podría utilizar datos derivados del mundo real para distribuciones de puntos semi-aleatorios con agrupamiento natural. Recientemente he estado haciendo un poco de análisis de conglomerados geoespaciales. Para esto he usado datos del mundo real: centroides de código postal (que forman grupos naturales alrededor de las ciudades); y ubicaciones de restaurantes. Otra sugerencia: podrías usar un catálogo estelar o un catálogo galáctico.

+3

zipcode centroids, nice. – Debilski

5

Generar pocas anclas. Verdaderos números aleatorios. Luego genere ruido alrededor de ellos:

anchor + dist * (random() - 0.5))

esto generará los números agrupados, que serán distribuidos de manera uniforme en la distancia dist.

0

Lo primero que pensé fue que podría implementar su propia herramienta usando linear congruential generator y experimentar con los coeficientes hasta que tenga un período lo suficientemente bajo como para satisfacer sus necesidades. Un coeficiente muy bajo m debería hacer el truco.

También me gusta su segunda idea de ejecutar un buen RNG en torno a algunos puntos preseleccionados para crear clusters. Puede apuntar a áreas específicas para los clusters con este método o también generarlas al azar.

1
  • Agregue una dimensión adicional a su modelo.
  • Dibuje una superficie irregular (es decir, no plana).
  • Generar números en el espacio ampliado.
  • Deseche todos los números que están en un lado de la superficie.
  • De cada número que quede, suelte la dimensión adicional.
1

Tal vez lo he entendido mal, pero la biblioteca GNU científica (escrito en C) tiene muchas distribuciones por escrito dentro de ella - no se podía recoger las coordenadas del Gauss/Poisson, etc de esa biblioteca?

http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html

Ellos proporcionan un ejemplo sencillo con la distribución de Poisson desde el enlace, también.

Si necesita que su distribución sea acotada (por ejemplo, coordenada y no inferior a -1), puede lograrlo mediante el muestreo de rechazo de la distribución uniforme en el gsl.

Bendiciones, Tom

+0

El OP no indica el entorno que está utilizando, y la licencia de GNU puede no ser adecuada para su proyecto. – winwaed

Cuestiones relacionadas