python生成正态分布矩阵_统计学习 | 矩阵正态分布 (matrix normal distribution)

前言:在机器学习和统计学习中,正态分布的身影无处不在,最为常见的是标准正态分布和多元正态分布 (multivariate normal distribution),两者分别作用于标量 (scalar) 和向量 (vector)。实际上,也存在一种正态分布的形式,它作用于矩阵,并广泛地应用于贝叶斯向量自回归模型 (Bayesian vector autoregression) 中。本文接下来将从大家所熟知的正态分布出发,先介绍矩阵正态分布,然后讨论矩阵正态分布在贝叶斯方法中的应用。

1 从标准正态分布到矩阵正态分布

1.1 标准正态分布

正态分布在机器学习和统计学习中随处可见,对于单一的随机变量

,其正态分布的形式为

其中,

表示均值,

表示标准差 (

表示方差)。当然,标准正态分布在我们中学时代就已经接触了。

1.2 多元正态分布

随着我们学习线性代数、概率论等相关课程,我们又认识到:若向量

服从正态分布,则存在一个多元正态分布 (multivariate normal distribution),形式为

其中,

对应着正态分布的均值,

则表示协方差矩阵。

需要说明的是,这里将多元正态分布的指数项写成矩阵迹 (trace) 的形式是为了方面后续认识矩阵正态分布,其中,在多元正态分布的写法中,

是恒成立的。

1.3 矩阵正态分布

除了作用于向量的正态分布,实际上还存在一种正态分布,它作用于矩阵,常见于贝叶斯向量自回归模型 (Bayesian vector autoregression model)。一般而言,对于随机矩阵

,若其服从矩阵正态分布,则形式为

其中,符号

来自于矩阵正态分布 (matrix normal distribution) 英文首字母的简写,下标指代随机矩阵的大小;矩阵

,与随机矩阵

大小相同,对应于均值项;矩阵

对应于协方差矩阵。

到这里,大家可能会发现:矩阵正态分布与多元正态分布在概率密度函数形式上存在较大差异。但实际上,我们依然可以从多元正态分布的角度理解矩阵正态分布,只要将矩阵正态分布进行向量化处理便可以得到多元正态分布形式,即

这两者完全等价 (证明过程可以参考wiki),公式中的符号

表示Kronecker积 (这个运算规则可参考外积、Kronecker积和张量积一文,本文不做详述),

表示多元正态分布的协方差矩阵;符号

表示将给定矩阵按列组织成一个向量。

不过,这里有一个值得思考的问题:既然矩阵正态分布和多元正态分布可以等价,那为何还要构造出如此复杂的矩阵正态分布呢?可能的原因要归结到协方差矩阵

上。实际上,假设我们想生成一个大小为

的随机矩阵

,并要求矩阵

在概率上服从矩阵正态分布。此时,若利用多元正态分布进行生成,则需要协方差矩阵

的大小为

,元素数量为

,显然,这个数字很惊人,毕竟存储这么大的矩阵就需要消耗计算机比较多的内存了。

因此,在很多时候,将矩阵正态分布用等价的多元正态分布替换有点不切实际。

2 贝叶斯向量自回归模型

2.1 向量自回归模型的数学表达式

在多元时间序列 (multivariate time series) 预测问题中,如果我们想借助回归模型对未来的序列进行合理估计,可采用简单的向量回归模型:

其中,

​表示​时刻的时间序列变量,是一个大小为​

的向量;​

表示大小

为​的自回归系数矩阵;向量

表示误差,常采用高斯噪声进行刻画。

一般而言,这条表达式可以被称为

​,其中,​

表示向量自回归模型的阶数。现在,假设​

,则我们需要估计的参数为

​,这些参数所包含的参数数量为​

.

为方便书写,向量自回归模型也可以写成如下形式:

其中,

是由系数矩阵构成;向量

这条公式也可以进一步写成如下形式:

其中,矩阵

;矩阵

.

2.2 构建贝叶斯模型

假设向量自回归模型中的误差项

为高斯噪声,即时间序列的观测值服从正态分布,则可以构建如下的贝叶斯向量自回归模型:

其中,符号

表示inverse Wishart分布,

表达式为

2.3 推导后验分布

构建贝叶斯模型之后,我们需要对贝叶斯模型进行后验估计,简而言之,依据贝叶斯准则(后验分布正比于似然函数和先验分布的乘积,即

),我们需要写出后验分布的具体表达式。(1) 似然函数

在上述贝叶斯向量自回归模型中,似然来自于时间序列的观测值

,即

其中,指数项中的求和部分可以被改写成如下形式:

综上所述,似然函数为

.(2) 先验分布

得,

得,

(3) 后验分布

依据贝叶斯准则,从

中可以推导出关于

的后验分布为

后验分布中的参数为

3 如何生成服从矩阵正态分布的随机矩阵?

现假设矩阵

服从矩阵正态分布

,若已知

,则生成随机矩阵

的原理如下:第一步:对矩阵

作Cholesky分解,即

,分别得到矩阵

第二步:用标准正态分布生成一个大小为

的矩阵

第三步:计算

,其中,

.

在Python中,可以利用numpy写出随机矩阵

的生成函数:

def mnrnd(M, U, V):

"""Generate matrix normal distributed random matrix.M is a m-by-n matrix, U is a m-by-m matrix, and V is a n-by-n matrix."""

import numpy as np

X0 = np.random.randn(M.shape)

P = np.linalg.cholesky(U)

Q = np.linalg.cholesky(V)

return M + P @ X0 @ Q.T

4 参考

你可能感兴趣的:(python生成正态分布矩阵)