【问题标题】:Python Random Number Generator within a normal distribution with Min and Max values具有最小值和最大值的正态分布中的 Python 随机数生成器
【发布时间】:2020-06-13 19:09:20
【问题描述】:

顺便说一句,有人建议我可以在 python 中使用半正态分布来设置使用 0 到无穷大的最小和最大点: halfnorm.rvs()

0 似乎切断了最小值,但我不知道如何处理无穷大。

我想在正态分布内创建一个 0 到 15 的数字生成器,但由于分布限制的性质,很难找到一个不超过最大值或低于最小值的函数。

【问题讨论】:

标签: python python-3.x scipy data-science normal-distribution


【解决方案1】:

我会尝试使用 beta 发行版:https://en.wikipedia.org/wiki/Beta_distribution。它非常简单(例如积分)并且能够拟合典型的反应时间分布。

现在的问题是如何有效地对固定的 α 和 β 参数进行采样...scipy 为我们做到了:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.beta.html

编辑:受评论和好奇心的驱使,这里有一个例子,绘制 10 个样本 á 1000 个值的直方图:

from scipy.stats import beta
from numpy import histogram
import pylab

max_time = 3
min_time = 0.5

a, b = 2, 7
dist = beta(a, b)

for _ in range(10):
    sample = min_time + dist.rvs(size=1000) * (max_time - min_time)
    his, bins = histogram(sample, bins=20, density=True)
    pylab.plot(bins[:-1], his, ".")
pylab.xlabel("Reaction time [s]")
pylab.ylabel("Probability density [1/s]")
pylab.grid()
pylab.show()

【讨论】:

  • 谢谢,我将尝试使用原始问题中的最小值和最大值在 python 中创建一个表示,除非你或其他人击败我,哈哈。
  • 为了保留你的答案,我不会用代码给出另一个答案(尽管请随意放置一个 REPREX)。我确实发现分布要好得多,并且可能是一个可行的解决方案。
【解决方案2】:

我刚刚回答了类似的问题here。我会在这里复制答案,因为我认为这个问题的标题信息量更大:

您可以使用边界从正态空间“平移”到均匀空间的均匀分布(使用误差函数),并使用逆误差函数将其转换为正态分布。

import matplotlib.pyplot as plt
import numpy as np
from scipy import special

mean = 0
std = 7
min_value = 0
max_value = 15

min_in_standard_domain = (min_value - mean) / std
max_in_standard_domain = (max_value - mean) / std

min_in_erf_domain = special.erf(min_in_standard_domain)
max_in_erf_domain = special.erf(max_in_standard_domain)

random_uniform_data = np.random.uniform(min_in_erf_domain, max_in_erf_domain, 10000)
random_gaussianized_data = (special.erfinv(random_uniform_data) * std) + mean
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].hist(random_uniform_data, 30)
axes[1].hist(random_gaussianized_data, 30)
axes[0].set_title('uniform distribution samples')
axes[1].set_title('erfinv(uniform distribution samples)')
plt.show()

【讨论】:

    【解决方案3】:

    我最近遇到了类似的问题。

    为了解决这个问题并将我的最小值/最大值保持在合理的范围内,我刚刚创建了一些 if 语句来捕获超出实际最小值和最大值的任何数字。

    if value <0:
        value = abs(value)
    elif value >15:
        value - 15 = diff
        value = 15-diff
    

    这对我来说已经足够接近了。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 2018-11-10
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-02-19
      • 1970-01-01
      相关资源
      最近更新 更多