我需要生成一个介于 [0,1] 之间的随机 float 向量 它们的总和等于 1 并且分布不均匀。 有没有生成这样一个向量的 python 函数?
祝福
最佳答案
您可能正在寻找的发行版称为 Dirichlet distribution . Python 中没有用于从 Dirichlet 分布中抽取随机数的内置函数,但是 NumPy包含一个:
>>> from numpy.random.mtrand import dirichlet
>>> print dirichlet([1] * n)
这将为您提供总和为 1 的 n 个数字,并且每个此类组合的概率都相等。
或者,如果您没有 NumPy,您可以利用这样一个事实,即可以通过绘制 n来生成从 n 维 Dirichlet 分布中抽取的随机样本em> 来自 gamma distribution 的独立样本形状和尺度参数等于 1,然后将样本除以总和:
>>> from random import gammavariate
>>> def dirichlet(n):
... samples = [gammavariate(1, 1) for _ in xrange(n)]
... sum_samples = sum(samples)
... return [x/sum_samples for x in samples]
之所以需要 Dirichlet 分布,是因为如果简单地从某个区间均匀地抽取随机数,然后将它们除以它们的总和,得到的分布将偏向于由大致相等的数字组成的样本。参见 Luc Devroye's book有关此主题的更多信息。
关于python - 非均匀分布随机数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028571/