maxframe.tensor.random.dirichlet#
- maxframe.tensor.random.dirichlet(alpha, size=None, chunk_size=None, gpu=None, dtype=None)[源代码]#
从狄利克雷分布中抽取样本。
从狄利克雷分布中抽取大小为 size、维度为 k 的样本。狄利克雷分布的随机变量可以看作是 Beta 分布的多变量推广。在贝叶斯推断中,狄利克雷概率密度函数是多项式分布的共轭先验。
- 参数:
alpha (array) -- 分布的参数(对于维度为 k 的样本,其维度为 k)。
size (int or tuple of ints, optional) -- 输出形状。如果给定形状例如
(m, n, k),则抽取m * n * k个样本。默认为 None,此时返回单个值。chunk_size (int or tuple of int or tuple of ints, optional) -- 每个维度上期望的块大小
gpu (bool, optional) -- 如果为 True,则将张量分配在 GPU 上,默认为 False
dtype (data-type, optional) -- 返回张量的数据类型。
- 返回:
samples —— 抽取的样本,形状为 (size, alpha.ndim)。
- 返回类型:
Tensor
- 抛出:
ValueError -- 如果 alpha 中存在小于或等于零的值
备注
\[X \approx \prod_{i=1}^{k}{x^{\alpha_i-1}_i}\]使用以下性质进行计算:对于每一维,从形状为 alpha_i 的标准伽马分布中抽取一个随机样本 y_i,然后 \(X = \frac{1}{\sum_{i=1}^k{y_i}} (y_1, \ldots, y_n)\) 服从狄利克雷分布。
引用
示例
以 Wikipedia 中引用的例子为例,如果想要将长度为 1.0 的字符串切割成 K 段不同长度的部分,其中每段平均具有指定的平均长度,但允许各段相对大小存在一些变化时,可以使用该分布。
>>> import maxframe.tensor as mt
>>> s = mt.random.dirichlet((10, 5, 3), 20).transpose()
>>> import matplotlib.pyplot as plt
>>> plt.barh(range(20), s[0].execute()) >>> plt.barh(range(20), s[1].execute(), left=s[0].execute(), color='g') >>> plt.barh(range(20), s[2].execute(), left=(s[0]+s[1]).execute(), color='r') >>> plt.title("Lengths of Strings")