2011-01-15 14 views
7

tengo scipy y numpy, Python v3.1pitón 3,1 - Creación de distribución normal

Necesito crear una matriz de 1D de longitud de 3 millones, utilizando números aleatorios entre (e incluyendo) 100-60,000. Tiene que ajustarse a una distribución normal.

Usando 'a = numpy.random.standard_normal (3000000)', obtengo una distribución normal para esa longitud requerida; no estoy seguro de cómo lograr el rango requerido.

+0

Si necesita enteros - verificar el caso extremo: es posible que tenga un 50% golpes cortados debido al redondeo! Simplemente genere 10000 números y cuente las ocurrencias de cada uno: deben ser más o menos iguales. Aquí hay un ejemplo de la superación del caso de borde con distribución 'uniforme' en 0..100:' round (random.uniform (-0.5, 100 + 0.5)) ' – kolypto

Respuesta

10

Una distribución normal estándar tiene 0 y desviación estándar 1. Lo que entiendo de sus requisitos es que necesita un ((60000-100)/2, (60000-100)/2). Tome cada valor del resultado standard_normal(), multiply it by the new variance, and add the new mean.

No he utilizado NumPy, pero una búsqueda rápida de la documentación dice que se puede lograr lo que desea directamente bu usando numpy.random.normal()

Un último dato: distribuciones normales no están acotadas. Eso significa que no hay un valor con probabilidad cero. Sus requisitos deben ser en términos de medias y variaciones (o desviaciones estándar), y no de límites.

+0

Vaya, no me di cuenta de que esto existía, +1, use este método en lugar del mío. – fmark

+0

¡Gracias por eso! Tomó un tiempo para entender pero llegué allí. Tanto un problema de programación como la comprensión de algunas estadísticas básicas. Aclamaciones. – jimy

+0

A menudo, sin embargo, encontramos valores en forma de rangos y solo queremos poner una distribución normal allí. No tiene que ser un requisito de nada. ¿Cómo entenderías la nueva varianza y la nueva media? La media debería ser probablemente el valor alrededor del cual queremos la mayoría de los valores, pero ¿qué pasa con la varianza? – Zelphir

-4

tratar este pequeño método:

usted querrá un método que sólo hace un número aleatorio.

import random 
list = [random.randint(min,max) for i in range(numitems)] 

Esto le dará una lista con números aleatorios numéricos entre min y max.

Por supuesto, 3000000 es una gran cantidad de elementos para tener en la memoria. Considere hacer los números aleatorios según los necesite el programa.

+0

' random.randrange' no crea una distribución normal. Además, el OP está pidiendo una matriz NumPy, no una lista. – Amber

6

Si desea una distribución normal verdaderamente aleatoria, no puede garantizar la extensión de los números. Se puede reducir la probabilidad de los valores atípicos, sin embargo, mediante la especificación de la desviación estándar

>>> n = 3000000 
>>> sigma5 = 1.0/1744278 
>>> n * sigma5 
1.7199093263803131 # Expect one values in 3 mil outside range at 5 stdev. 
>>> sigma6 = 1.0/1/506800000 
>>> sigma6 = 1.0/506800000 
>>> n * sigma6 
0.0059194948697711127 # Expect 0.005 values in 3 mil outside range at 6 stdev. 
>>> sigma7 = 1.0/390600000000 
>>> n * sigma7 
7.6804915514592934e-06 

Por lo tanto, en este caso, asegurando que la desviación estándar es solamente 1/6 o 1/7 de la mitad del rango le dará razonable Confianza en que sus datos no excederán el rango.

>>> range = 60000 - 100 
>>> spread = (range/2)/6 # Anything outside of the range will be six std. dev. from the mean 
>>> mean = (60000 + 100)/2 
>>> a = numpy.random.normal(loc = mean, scale = spread, size = n) 
>>> min(a) 
6320.0238199673404 
>>> max(a) 
55044.015566089176 

Por supuesto, todavía se puede realizar un valores que caen fuera del rango aquí

+1

He usado anteriormente, pero los comentarios me ayudaron mucho con la comprensión. ¡Gracias! – jimy

Cuestiones relacionadas