Categorical

class paddle.distribution. Categorical ( logits, name=None ) [源代码]

类别分布是一种离散概率分布,其随机变量可以取 K 个相互独立类别的其中一个。

概率质量函数(pmf)为:

\[pmf(k; p_i) =\prod_{i=1}^{k} p_i^{[x=i]}\]

上面公式中:

  • \([x = i]\) 表示:如果 \(x==i\),则表达式取值为 1,否则取值为 0。

参数

  • logits (list|tuple|numpy.ndarray|Tensor) - 类别分布对应的 logits。数据类型为 float32 或 float64。

  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。

代码示例

>>> import paddle
>>> from paddle.distribution import Categorical

>>> paddle.seed(100) # on CPU device
>>> x = paddle.rand([6])
>>> print(x)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.55355281, 0.20714243, 0.01162981, 0.51577556, 0.36369765, 0.26091650])

>>> paddle.seed(200) # on CPU device
>>> y = paddle.rand([6])
>>> print(y)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.77663314, 0.90824795, 0.15685187, 0.04279523, 0.34468332, 0.79557180])

>>> cat = Categorical(x)
>>> cat2 = Categorical(y)

>>> paddle.seed(1000) # on CPU device
>>> print(cat.sample([2,3]))
Tensor(shape=[2, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
[[0, 1, 5],
[3, 4, 5]])

>>> print(cat.entropy())
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
1.77528250)

>>> print(cat.kl_divergence(cat2))
Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.07195196])

>>> value = paddle.to_tensor([2,1,3])
>>> print(cat.probs(value))
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.00608027, 0.10829761, 0.26965630])

>>> print(cat.log_prob(value))
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
[-5.10270691, -2.22287226, -1.31060708])

方法

sample(shape)

生成指定维度的样本

参数

  • shape (list) - 指定生成样本的维度。

返回

预先设计好维度的 Tensor。

代码示例

>>> import paddle
>>> from paddle.distribution import Categorical

>>> paddle.seed(100) # on CPU device
>>> x = paddle.rand([6])
>>> print(x)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.55355281, 0.20714243, 0.01162981, 0.51577556, 0.36369765, 0.26091650])

>>> cat = Categorical(x)
>>> paddle.seed(1000) # on CPU device
>>> print(cat.sample([2,3]))
Tensor(shape=[2, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
[[0, 1, 5],
[3, 4, 5]])

kl_divergence(other)

相对于另一个类别分布的 KL 散度。

参数

  • other (Categorical) - 输入的另一个类别分布。数据类型为 float32。

返回

相对于另一个类别分布的 KL 散度,数据类型为 float32。

代码示例

>>> import paddle
>>> from paddle.distribution import Categorical

>>> paddle.seed(100) # on CPU device
>>> x = paddle.rand([6])
>>> print(x)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.55355281, 0.20714243, 0.01162981, 0.51577556, 0.36369765, 0.26091650])

>>> paddle.seed(200) # on CPU device
>>> y = paddle.rand([6])
>>> print(y)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.77663314, 0.90824795, 0.15685187, 0.04279523, 0.34468332, 0.79557180])

>>> cat = Categorical(x)
>>> cat2 = Categorical(y)

>>> print(cat.kl_divergence(cat2))
Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.07195196])

entropy()

信息熵。

返回

类别分布的信息熵,数据类型为 float32。

代码示例

>>> import paddle
>>> from paddle.distribution import Categorical

>>> paddle.seed(100) # on CPU device
>>> x = paddle.rand([6])
>>> print(x)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.55355281, 0.20714243, 0.01162981, 0.51577556, 0.36369765, 0.26091650])

>>> cat = Categorical(x)

>>> print(cat.entropy())
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
1.77528250)

probs(value)

所选择类别的概率。 如果 logits 是 2-D 或更高阶的 Tensor,那么其最后一个维度表示不同类别的概率,其它维度被看做不同的概率分布。 同时,如果 value 是 1-D Tensor,那么 value 会 broadcast 成与 logits 具有相同的概率分布数量。 如果 value 为更高阶 Tensor,那么 value 应该与 logits 具有相同的概率分布数量。也就是说,value.shape[:-1] = logits.shape[:-1]

参数

  • value (Tensor) - 输入 Tensor,表示选择的类别下标。数据类型为 int32 或 int64。

返回

给定类别下标的概率。

>>> import paddle
>>> from paddle.distribution import Categorical

>>> paddle.seed(100) # on CPU device
>>> x = paddle.rand([6])
>>> print(x)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.55355281, 0.20714243, 0.01162981, 0.51577556, 0.36369765, 0.26091650])

>>> cat = Categorical(x)

>>> value = paddle.to_tensor([2,1,3])
>>> print(cat.probs(value))
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.00608027, 0.10829761, 0.26965630])

log_prob(value)

所选择类别的对数概率。

参数

  • value (Tensor) - 输入 Tensor,表示选择的类别下标。数据类型为 int32 或 int64。

返回

对数概率。

>>> import paddle
>>> from paddle.distribution import Categorical

>>> paddle.seed(100) # on CPU device
>>> x = paddle.rand([6])
>>> print(x)
Tensor(shape=[6], dtype=float32, place=Place(cpu), stop_gradient=True,
[0.55355281, 0.20714243, 0.01162981, 0.51577556, 0.36369765, 0.26091650])

>>> cat = Categorical(x)

>>> value = paddle.to_tensor([2,1,3])
>>> print(cat.log_prob(value))
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
[-5.10270691, -2.22287226, -1.31060708])