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")