如何在Python中生成Log Uniform Distribution?

jkr*_*ish 12 python numpy uniform-distribution neuraxle

我找不到Python中的内置函数来生成一个给定最小值和最大值的日志均匀分布(R等价于此处),如:loguni [n,exp(min),exp(max),base]返回n log,均匀分布在exp(min)和exp(max)范围内.

我发现的最接近的是numpy.random.uniform.

Sco*_*nte 15

来自http://ecolego.facilia.se/ecolego/show/Log-Uni​​form%20Distribution:

在loguniform分布中,假设logtransformed随机变量是均匀分布的.

从而

logU(a, b) ~ exp(U(log(a), log(b))
Run Code Online (Sandbox Code Playgroud)

因此,我们可以使用以下方法创建对数均匀分布numpy:

def loguniform(low=0, high=1, size=None):
    return np.exp(np.random.uniform(low, high, size))
Run Code Online (Sandbox Code Playgroud)

如果您想选择不同的基数,我们可以定义一个新函数,如下所示:

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

  • @Anatoly-Alekseev这真的应该是一个单独的问题.但是,如果您需要提示,那么您链接的页面底部需要一个很好的代码示例.您只需将pdf替换为日志统一分布的pdf:$$ f_ {X}(x)=\frac {I _ {[e ^ a,e ^ b]}(x)} {x(b - a) } $$.在此衍生:https://stats.stackexchange.com/questions/110070/log-uniform-distributions (2认同)

Sco*_*ott 14

SciPy v1.4 包含一个loguniform随机变量:https : //docs.scipy.org/doc/scipy/reference/generated/scipy.stats.loguniform.html

以下是如何使用它:

from scipy.stats import loguniform

rvs = loguniform.rvs(1e-2, 1e0, size=1000)
Run Code Online (Sandbox Code Playgroud)

这将创建均匀分布在 0.01 和 1 之间的随机变量。 通过可视化对数缩放直方图可以最好地展示这一点:

无论基数如何,这种“日志缩放”都有效;loguniform.rvs(2**-2, 2**0, size=1000)也产生对数均匀随机变量。更多细节在loguniform的文档中。


小智 8

我相信这scipy.stats.reciprocal是你想要的分布。
从文档:

倒数的概率密度函数为:

f(x, a, b) = \frac{1}{x \log(b/a)}
Run Code Online (Sandbox Code Playgroud)

对于 a <= x <= b 和 a, b > 0

相互取ab作为形状参数。