我需要生成[0,1]之间的随机浮点数向量 他们的总和等于1并且非均匀地分布。 是否有任何python函数可以生成这样的向量?
祝福
答案 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]