numpy.random.Generator.dirichlet#
方法
- random.Generator.dirichlet(alpha, size=None)#
从 Dirichlet 分布中抽取样本。
从狄利克雷分布中抽取
size个维度为 k 的样本。狄利克雷分布随机变量可以看作是 Beta 分布的多元推广。在贝叶斯推断中,狄利克雷分布是多项式分布的共轭先验。- 参数:
- alpha浮点数序列,长度为 k
分布的参数(长度为
k的样本的长度为k)。- sizeint 或 int 的元组,可选
输出形状。如果给定的形状是,例如,
(m, n),那么将抽取m * n * k个样本。默认为 None,在这种情况下,将返回一个长度为k的向量。
- 返回:
- samplesndarray,
抽取的样本,形状为
(size, k)。
- 引发:
- ValueError
如果
alpha中的任何值为负
备注
狄利克雷分布是关于满足条件 \(x_i>0\) 和 \(\sum_{i=1}^k x_i = 1\) 的向量 \(x\) 的分布。
狄利克雷分布随机向量 \(X\) 的概率密度函数 \(p\) 正比于
\[p(x) \propto \prod_{i=1}^{k}{x^{\alpha_i-1}_i},\]其中 \(\alpha\) 是包含正浓度参数的向量。
该方法使用以下性质进行计算:设 \(Y\) 是一个随机向量,其分量遵循标准伽马分布,则 \(X = \frac{1}{\sum_{i=1}^k{Y_i}} Y\) 服从狄利克雷分布。
参考
[1]David McKay,“信息论、推断和学习算法”,第 23 章,https://www.inference.org.uk/mackay/itila/
[2]维基百科,“狄利克雷分布”,https://en.wikipedia.org/wiki/Dirichlet_distribution
示例
以维基百科中的一个例子为例,当想要将(初始长度均为 1.0 的)字符串切成 K 段,且每段的平均长度具有指定的平均值,同时允许各段相对大小存在一些变化时,可以使用此分布。
>>> rng = np.random.default_rng() >>> s = rng.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")