El mundo está gobernado por el azar. La aleatoriedad nos acecha todos los días de nuestra vida.
– Paul Auster
Los números aleatorios nos rodean en el mundo de la ciencia de datos. De vez en cuando necesito elaborar rápidamente algunos números aleatorios para ejecutar un experimento mental o para demostrar un concepto a una audiencia, pero sin tener que descargar grandes conjuntos de datos.
Desde la creación de datos ficticios hasta la reproducción aleatoria de los datos con fines de entrenamiento y prueba o la inicialización de pesos de una red neuronal, generamos números aleatorios todo el tiempo en Python. Te encantará este concepto una vez que lo domines después de este artículo.
En mi opinión, la generación de números aleatorios es un tema que debe conocer cualquier persona en ciencia de datos. Lo guiaré a través de todo el proceso de generación de números aleatorios en Python aquí y también lo demostraré usando diferentes técnicas.
¿Nuevo en Python? Estos dos cursos gratuitos te ayudarán a comenzar:
Tabla de contenido
- Biblioteca aleatoria
- Sembrando números aleatorios
- Generando números aleatorios en un rango
- Tomando aleatoriamente de una lista
- Mezclar una lista
- Generación de números aleatorios según distribuciones
Generando números aleatorios en Python usando la biblioteca aleatoria
Estas son las buenas noticias: hay varias formas de generar números aleatorios en Python. El método más sencillo es utilizar aleatorio módulo. Es un módulo integrado en Python y no requiere instalación. Este módulo utiliza un generador de números pseudoaleatorios (PRNG) conocido como Mersenne Twister para generar números aleatorios.
Un generador de números pseudoaleatorios es un generador de números aleatorios determinista. No genera números verdaderamente aleatorios. Toma un número como entrada y genera un número aleatorio para él.
Nota: No utilice el aleatorio módulo para generar números aleatorios por motivos de seguridad. Para usos criptográficos y de seguridad, puede utilizar el misterios módulo que utiliza generadores de números aleatorios verdaderos (TRNG).
Sembrando números aleatorios
Como discutimos en la sección anterior, el módulo aleatorio toma un número como entrada y genera un número aleatorio para él. Este valor inicial se conoce como semilla y el procedimiento se conoce como semilla.
Los números que generamos mediante generadores de números pseudoaleatorios son deterministas. Esto significa que se pueden replicar utilizando la misma semilla.
Entendamos con un ejemplo:
import random print('Random Number 1=>',random.random()) print('Random Number 2=>',random.random())
Aquí, estoy usando la función random () que genera un número aleatorio en el rango [0.0, 1.0]. Note aquí que no he mencionado el valor de la semilla. De forma predeterminada, la hora actual del sistema en milisegundos se utiliza como semilla. Echemos un vistazo a la salida.
Ambos números son diferentes debido al cambio en el tiempo durante la ejecución de la primera declaración a la segunda declaración. Veamos qué pasa si sembramos los generadores con el mismo valor:
random.seed(42) print('Random Number 1=>',random.random()) random.seed(42) print('Random Number 2=>',random.random())
Obtenemos los mismos números aquí. Es por eso que los generadores de números pseudoaleatorios son deterministas y no se usan con fines de seguridad porque cualquiera que tenga la semilla puede generar el mismo número aleatorio.
Generando números aleatorios en un rango
Hasta ahora, sabemos cómo crear números aleatorios en el rango [0.0, 1.0]. Pero, ¿qué pasa si tenemos que crear un número en un rango diferente a este?
Una forma es multiplicar y sumar números al número devuelto por el aleatorio() función. Por ejemplo, random.random () * 3 + 2 devolverá números en el rango [2.0, 5.0]. Sin embargo, esto es más una solución alternativa, no una solución directa.
¡No te preocupes! El módulo aleatorio te respalda aquí. Proporciona uniforme() y randint () funciones que podemos utilizar para este propósito. Entendamos uno por uno.
uniforme()
La función uniform () del módulo aleatorio toma los valores inicial y final de un rango como argumentos y devuelve un número aleatorio de punto flotante en el rango. [starting, ending]:
print('Random Number in range(2,8)=>', random.uniform(2,8))
randint ()
Esta función es similar a la función uniform (). La única diferencia es que la función uniform () devuelve números aleatorios de punto flotante y la función randint () devuelve un número entero. También devuelve el número en el rango [starting, ending]:
print('Random Number in a range(2,8)=>', random.randint(2,8))
Tomando aleatoriamente de una lista
elección() Y opciones () son las dos funciones proporcionadas por el módulo aleatorio que podemos usar para seleccionar valores aleatoriamente de una lista. Ambas funciones toman una lista como argumento y seleccionan aleatoriamente un valor de ella. ¿Puedes adivinar cuál es la diferencia entre elección() y opciones () ¿es?
elección() solo elige un valor único de una lista, mientras que opciones () elige varios valores de una lista con reemplazo. Una cosa fantástica acerca de estas funciones es que también funcionan en una lista que contiene cadenas. Veámoslos en acción:
a=[5, 9, 20, 10, 2, 8] print('Randomly picked number=>',random.choice(a)) print('Randomly picked number=>',random.choices(a,k=3))
Como se puede ver, elección() devolvió un valor único de a y opciones () devolvió tres valores de a. Aquí, k es la longitud de la lista devuelta por opciones ().
Una cosa más que puede notar en las respuestas devueltas por opciones () es que cada valor ocurre solo una vez. Puede aumentar la probabilidad de que se elija cada valor pasando una matriz como pesos al opciones () función. Entonces, aumentemos la probabilidad de 10 hasta tres veces más y veamos los resultados:
for _ in range(5): print('Randomly picked number=>',random.choices(a,weights=[1,1,1,3,1,1],k=3))
Aquí, podemos ver que ocurrieron 10 en cada sorteo de la lista. También existe un muestra() función en el módulo aleatorio que funciona de manera similar a la opciones () función pero toma muestras aleatorias de una lista sin reemplazo.
Mezclar una lista
Digamos que no queremos seleccionar valores de una lista, sino que solo queremos reordenarlos. Podemos hacer esto usando el barajar() función del módulo aleatorio. Esta barajar() La función toma la lista como argumento y baraja la lista en su lugar:
print('Original list=>',a) random.shuffle(a) print('Shuffled list=>',a)
Nota: la función shuffle () no devuelve una lista.
Generación de números aleatorios según distribuciones
Una característica más sorprendente del módulo aleatorio es que nos permite generar números aleatorios basados en diferentes distribuciones de probabilidad. Hay varias funciones como gauss(), expovariate (), etc., que nos ayudan a hacer esto.
Si no está familiarizado con las distribuciones de probabilidad, le recomiendo que lea este artículo: 6 distribuciones de probabilidad comunes que todo profesional de la ciencia de datos debe conocer.
gauss()
Comencemos con la distribución de probabilidad más común, es decir, la distribución normal. gauss() es una función del módulo aleatorio utilizado para generar números aleatorios de acuerdo con una distribución normal. Toma la media y la desviación estándar como argumento y devuelve un número aleatorio:
for _ in range(5): print(random.gauss(0,1))
Aquí, tracé 1000 números aleatorios generados por el gauss() función para media igual a 0 y desviación estándar como 1. Puede ver arriba que todos los puntos están distribuidos alrededor de la media y no están ampliamente distribuidos ya que la desviación estándar es 1.
expovariate ()
La distribución exponencial es otra distribución de probabilidad muy común que encontrará. los expovariate () La función se usa para obtener un número aleatorio de acuerdo con la distribución exponencial. Toma el valor de lambda como argumento y devuelve un valor de 0 a infinito positivo si lambda es positivo, y de infinito negativo a 0 si lambda es negativo:
print('Random number from exponential distribution=>',random.expovariate(10))
Notas finales
A menudo uso números aleatorios para crear conjuntos de datos ficticios y para muestreo aleatorio. Me encantaría saber cómo usa números aleatorios en sus proyectos, así que comente a continuación con sus pensamientos y compártalos con la comunidad.
Si este artículo le pareció informativo, compártalo con sus amigos y comente a continuación sus consultas y comentarios. He enumerado algunos artículos asombrosos relacionados con Python y la ciencia de datos a continuación para su referencia: