numpy.random.dirichlet#

random.dirichlet(alpha, size=None)#

从 Dirichlet 分布中抽取样本。

从 Dirichlet 分布中抽取维度为 k 的 size 个样本。Dirichlet 分布的随机变量可以看作是 Beta 分布的多元推广。在贝叶斯推断中,Dirichlet 分布是多项分布的共轭先验。

注意

新代码应该使用 Generator 实例的 dirichlet 方法;请参阅快速入门

参数:
alpha浮点数序列,长度为 k

分布参数(对于长度为 k 的样本,参数长度为 k)。

sizeint 或 int 元组,可选

输出形状。如果给定的形状是例如 (m, n),则会抽取 m * n * k 个样本。默认值为 None,在这种情况下返回长度为 k 的向量。

返回值:
samplesndarray,

抽取的样本,形状为 (size, k)

抛出:
ValueError

如果 alpha 中的任何值小于或等于零

另请参阅

random.Generator.dirichlet

新代码应使用此方法。

注释

Dirichlet 分布是一种对向量 \(x\) 的分布,满足条件 \(x_i>0\)\(\sum_{i=1}^k x_i = 1\)

Dirichlet 分布随机向量 \(X\) 的概率密度函数 \(p\) 与以下表达式成比例:

\[p(x) \propto \prod_{i=1}^{k}{x^{\alpha_i-1}_i},\]

其中 \(\alpha\) 是一个包含正浓度参数的向量。

该方法利用以下性质进行计算:设 \(Y\) 是一个随机向量,其分量服从标准 gamma 分布,则 \(X = \frac{1}{\sum_{i=1}^k{Y_i}} Y\) 服从 Dirichlet 分布

参考

[1]

David McKay, “Information Theory, Inference and Learning Algorithms,” chapter 23, https://www.inference.org.uk/mackay/itila/

[2]

Wikipedia, “Dirichlet distribution”, https://en.wikipedia.org/wiki/Dirichlet_distribution

示例

引用 Wikipedia 中的一个示例,如果你想将字符串(每个初始长度为 1.0)切成 K 段不同长度的片段,并且每个片段平均具有一个指定的平均长度,同时允许片段相对大小存在一些变化,那么可以使用此分布。

>>> s = np.random.dirichlet((10, 5, 3), 20).transpose()
>>> import matplotlib.pyplot as plt
>>> plt.barh(range(20), s[0])
>>> plt.barh(range(20), s[1], left=s[0], color='g')
>>> plt.barh(range(20), s[2], left=s[0]+s[1], color='r')
>>> plt.title("Lengths of Strings")
../../../_images/numpy-random-dirichlet-1.png