非均匀分布随机数组

时间:2010-06-12 11:55:09

标签: python random

我需要生成[0,1]之间的随机浮点数向量 他们的总和等于1并且非均匀地分布。 是否有任何python函数可以生成这样的向量?

祝福

2 个答案:

答案 0 :(得分:16)

您可能正在寻找的发行版称为Dirichlet distribution。 Python中没有用于从Dirichlet分布中绘制随机数的内置函数,但NumPy包含一个:

>>> from numpy.random.mtrand import dirichlet
>>> print dirichlet([1] * n)

这将为您提供总计为1的 n 数字,并且每个此类组合的概率将相等。

或者,如果你没有NumPy,你可以利用从 n 维Dirichlet分布中抽取的随机样本可以通过绘制 n 来自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

答案 1 :(得分:2)

Wikipedia page: Dirichlet distribution中有一个更好的例子。 下面的代码生成k维样本:

params = [a1, a2, ..., ak]
sample = [random.gammavariate(a,1) for a in params]
sample = [v/sum(sample) for v in sample]