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 loguniform
documentació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
yb
como parámetros de forma.