Path: blob/master/site/zh-cn/probability/examples/Gaussian_Copula.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
[Copula](https://en.wikipedia.org/wiki/Copula_(probability_theory)) 是一种捕获随机变量之间依赖关系的经典方式。更正式地说,Copula 是一种多元分布 ,通过边缘化得到 。
Copula 很有趣,因为我们可以用它来创建任意边缘的多元分布。配方如下:
使用概率积分变换将任意连续的 R.V. 变为一个均匀的 ,其中 是 的 CDF。
给定一个 Copula(比如,二元变量),我们会得到 和 具有均匀的边缘分布。
现在给定我们感兴趣的 R.V's ,创建一个新的分布 。 和 的边缘是我们想要的。
边缘是单变量的,因此可能更容易测量和/或建模。Copula 可以从边缘开始,但也可以实现各维度之间的任意关联。
高斯 Copula
为了说明如何构造 Copula,请考虑根据多元高斯相关性来捕获依赖关系的情况。高斯 Copula 由 给出,其中 表示多元正态分布的 CDF,协方差为 ,均值为 0, 是标准正态分布的逆 CDF。
应用正态分布的逆 CDF 会将均匀维度扭曲为正态分布。应用多元正态分布的 CDF 则会将分布挤压为边缘均匀且具有高斯相关性。
因此,我们得到的高斯 Copula 是在单位超立方体 上具有均匀边缘的分布。
这样定义的高斯 Copula 可以使用 tfd.TransformedDistribution
和适当的 Bijector
来实现。也就是说,我们通过使用正态分布的逆 CDF(由 tfb.NormalCDF
双射器实现)来变换多元正态分布。
下面,我们用一个简化的假设来实现高斯 Copula:协方差由 Cholesky 因子参数化(因此为 MultivariateNormalTriL
的协方差)。(我们可以使用其他 tf.linalg.LinearOperators
来编码不同的无矩阵假设)。
然而,这种模型的功效在于使用概率积分变换,以在任意 R.V.s. 上使用 Copula。这样,我们可以指定任意边缘,并使用 Copula 将它们拼接在一起。
我们从下面的模型开始:
使用 Copula 获得一个双变量 R.V. ,其边缘为 Kumaraswamy 和 Gumbel。
我们先绘制由这两个 R.V.s. 生成的积分布。这只是作为我们应用 Copula 时的一个比较点。
具有不同边缘的联合分布
现在,我们使用高斯 Copula 将分布耦合在一起,并进行绘制。同样,我们选择的工具是 TransformedDistribution
,应用适当的 Bijector
来获得所选的边缘。
具体来说,我们使用 Blockwise
双射器,它会在向量的不同部分应用不同的双射器(仍然是双射变换)。
现在,我们可以定义想要的 Copula。给定一个目标边缘的列表(编码为双射器),我们可以轻松构造一个使用 Copula 并具有指定边缘的新分布。
最后,我们来实际使用这个高斯 Copula。我们将使用 的Cholesky,它将对应于方差 1,以及多元正态分布的相关性 。
我们来看几个案例:
最后,我们来验证一下,我们是否确实获得了所需的边缘。
结论
我们成功了!我们已经证明了可以使用 Bijector
API 构造高斯 Copula。
概括地说就是,使用 Bijector
API 编写双射器,并将其与分布组合在一起,可以创建丰富的分布系列,实现灵活建模。