MultivariateNormal

class paddle.distribution. MultivariateNormal ( loc, covariance_matrix=None, precision_matrix=None, scale_tril=None ) [源代码]

MultivariateNormal 是一种定义在实数域上的多元连续型概率分布,参数 loc 表示均值,以及需要传入以下任意一种矩阵描述其方差: covariance_matrixprecision_matrixscale_tril

其概率密度函数(pdf)为:

\[p(X ;\mu, \Sigma) = \frac{1}{\sqrt{(2\pi)^k |\Sigma|}} \exp(-\frac{1}{2}(X - \mu)^{\intercal} \Sigma^{-1} (X - \mu))\]

其中:

  • \(X\) 是 k 维随机向量。

  • \(\mu\) 是 k 维均值向量。

  • \(\Sigma\) 是 k 阶协方差矩阵。

参数

  • loc (int|float|Tensor) - 即上述公式中 \(\mu\) 参数,是 MultivariateNormal 的均值向量。如果 loc 的输入数据类型是 intfloat 则会被转换为数据类型为 paddle 全局默认数据类型的 1-D Tensor。

  • covariance_matrix (Tensor,可选) - 即上述公式中 \(\mu\) 参数,是 MultivariateNormal 的协方差矩阵。covariance_matrix 的数据类型会被转换为与 loc 相同的类型。默认值为 None。

  • precision_matrix (Tensor,可选) - 是 MultivariateNormal 协方差矩阵的逆矩阵。precision_matrix 的数据类型会被转换为与 loc 相同的类型。默认值为 None。

  • scale_tril (Tensor,可选) - 是 MultivariateNormal 协方差矩阵的柯列斯基分解的下三角矩阵。scale_tril 的数据类型会被转换为与 loc 相同的类型。默认值为 None。

代码示例

>>> import paddle
>>> from paddle.distribution import MultivariateNormal
>>> paddle.set_device("cpu")
>>> paddle.seed(100)

>>> rv = MultivariateNormal(loc=paddle.to_tensor([2.,5.]), covariance_matrix=paddle.to_tensor([[2.,1.],[1.,2.]]))

>>> print(rv.sample([3, 2]))
Tensor(shape=[3, 2, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
[[[-0.00339603,  4.31556797],
  [ 2.01385283,  4.63553190]],
 [[ 0.10132277,  3.11323833],
  [ 2.37435842,  3.56635118]],
 [[ 2.89701366,  5.10602522],
  [-0.46329355,  3.14768648]]])

>>> print(rv.mean)
Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
[2., 5.])

>>> print(rv.variance)
Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
[1.99999988, 2.        ])

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

>>> rv1 = MultivariateNormal(loc=paddle.to_tensor([2.,5.]), covariance_matrix=paddle.to_tensor([[2.,1.],[1.,2.]]))
>>> rv2 = MultivariateNormal(loc=paddle.to_tensor([-1.,3.]), covariance_matrix=paddle.to_tensor([[3.,2.],[2.,3.]]))
>>> print(rv1.kl_divergence(rv2))
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
1.55541301)

属性

mean

MultivariateNormal 分布的均值

返回

Tensor,均值

variance

MultivariateNormal 分布的方差

返回

Tensor,方差

方法

prob(value)

计算 value 的概率。

参数

  • value (Tensor) - 待计算值。

返回

Tensor,value 的概率。数据类型与 self.loc 相同。

log_prob(value)

计算 value 的对数概率。

参数

  • value (Tensor) - 待计算值。

返回

Tensor,value 的对数概率。数据类型与 self.loc 相同。

sample(shape=())

从 MultivariateNormal 分布中生成满足特定形状的样本数据。最终生成样本形状为 sample_shape + batch_shape + event_shape

参数

  • shape (Sequence[int],可选):采样次数。

返回

Tensor,样本数据。其维度为 \(\text{sample shape} + \text{batch shape} + \text{event shape}\) 。数据类型与 self.loc 相同。

rsample(shape=())

重参数化采样,生成指定维度的样本。最终生成样本形状为 sample_shape + batch_shape + event_shape

参数

  • shape (Sequence[int],可选):采样次数。

返回

Tensor,样本数据。其维度为 \(\text{sample shape} + \text{batch shape} + \text{event shape}\) 。数据类型与 self.loc 相同。

entropy()

计算 MultivariateNormal 分布的信息熵。

\[\mathcal{H}(X) = \frac{n}{2} \log(2\pi) + \log {\det A} + \frac{n}{2}\]

返回

多元正态分布的信息熵,数据类型与 self.loc 相同。

kl_divergence(other)

相对于另一个多元正态分布的 KL 散度,两个分布需要有相同的 \(\text{batch shape}\)\(\text{event shape}\)

\[KL\_divergence(\lambda_1, \lambda_2) = \log(\det A_2) - \log(\det A_1) -\frac{n}{2} +\frac{1}{2}[tr [\Sigma_2^{-1} \Sigma_1] + (\mu_1 - \mu_2)^{\intercal} \Sigma_2^{-1} (\mu_1 - \mu_2)]\]

参数

  • other (MultivariateNormal) - 输入的另一个多元正态分布。

返回

相对于另一个多元正态分布的 KL 散度,数据类型与 self.loc 相同。