Saltar al contenido

¿Cómo puedo generar una distribución uniforme de registros en Python?

Solución:

De http://ecolego.facilia.se/ecolego/show/Log-Uniform%20Distribution:

En una distribución loguniforme, se supone que la variable aleatoria transformada logarítmicamente está distribuida uniformemente.

Por lo tanto

logU(a, b) ~ exp(U(log(a), log(b))

Por lo tanto, podríamos crear una distribución logarítmica uniforme utilizando numpy:

def loguniform(low=0, high=1, size=None):
    return np.exp(np.random.uniform(low, high, size))

Si desea elegir una base diferente, podríamos definir una nueva función de la siguiente manera:

def lognuniform(low=0, high=1, size=None, base=np.e):
    return np.power(base, np.random.uniform(low, high, size))

EDITAR: la respuesta de @ joaoFaria también es correcta.

def loguniform(low=0, high=1, size=None):
    return scipy.stats.reciprocal(np.exp(low), np.exp(high)).rvs(size)

SciPy v1.4 incluye un loguniform variable aleatoria: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.loguniform.html

He aquí cómo usarlo:

from scipy.stats import loguniform

rvs = loguniform.rvs(1e-2, 1e0, size=1000)

Esto creará variables aleatorias espaciadas uniformemente entre 0.01 y 1. Lo que se muestra mejor visualizando el histograma de escala logarítmica:

Esta “escala logarítmica” funciona independientemente de la base; loguniform.rvs(2**-2, 2**0, size=1000) también produce variables aleatorias log-uniformes. Más detalles están en loguniformdocumentación de.

Creo que el scipy.stats.reciprocal es la distribución que desea.
De la documentación:

La función de densidad de probabilidad para recíproco es:

f(x, a, b) = frac{1}{x log(b/a)}

para a <= x <= by a, b> 0

toma recíproca a y b como parámetros de forma.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *