平均多元正态分布,沿向量扩展协方差

时间:2018-10-05 17:06:21

标签: python scipy statistics probability

如果我有两个单独的多元普通随机变量:

from scipy.stats import multivariate_normal
import numpy as np

cov0=np.array([
    [1,0,0],
    [0,1,0],
    [0,0,1]
])
mean0 = np.array([1,1,1])
rv3d_0 = multivariate_normal(mean=mean0, cov=cov0)

cov1=np.array([
    [1,0,0],
    [0,1,0],
    [0,0,1]
])
mean1 = np.array([4,4,4])
rv3d_1 = multivariate_normal(mean=mean1, cov=cov1)

然后,我对创建介于这两者之间的新随机变量感兴趣:

mean_avg = (mean0+mean1)/2
cov_avg = (cov0+cov1)/2
rv3d_avg = multivariate_normal(mean=mean_avg, cov=cov_avg)

# I can then plot the points generated by:
rv3d_0.rvs(1000)
rv3d_1.rvs(1000)
rv3d_avg.rvs(1000)

但是,当查看生成的点时,可预测的协方差与两个分量相同。但是,我想让沿着矢量(mean1-mean0)的协方差比沿着正交矢量的协方差更大。我认为也许对协方差取平均值不是正确的技术?欢迎任何建议,谢谢!

2 个答案:

答案 0 :(得分:0)

这是一个有趣的问题。这样看:您对协方差分量有一些特定的方向,即均值1-均值0是一个方向,与均值1-均值0正交的平面包含其他方向。在这些方向上,您要指定变化的幅度,即在正交平面上是某种东西(比如说FOO),而在mean1-mean0方向​​上是很多(比如说100倍FOO)。

您可以通过Gram-Schmidt算法或其他方法找到正交平面的基础。此时,您可以构建协方差矩阵:令S =找到的方向的列(即mean1-均值加上正交平面的基数),让D =对角矩阵为100 FOO,FOO,FOO,。 ..,对角线上的FOO。现在,S D S ^ T(其中S ^ T是矩阵转置)是具有所需性质的正定矩阵。

您也许可以避免使用Gram-Schmidt,但是无论如何您的目标都是相同的:指定所需的属性,然后构造一个矩阵来满足它们。

答案 1 :(得分:0)

我建议采用以下方法:

1- 从两个分布中抽取大量观察值(比如 10000 个):obs0obs1

2- 创建一个新的观察数组 obs_avg,它是 obs0obs1 的总和除以 2

3- 对于得到的数组,计算均值和协方差。代码应如下所示:

import numpy as np
obs0 = np.random.normal(mean0, np.sqrt(cov0), 10000) #sampling from a normal distribution
obs1 = np.random.normal(mean1, np.sqrt(cov1), 10000)
obs_avg = (obs0 + obs1)/2
mean_avg = np.mean(obs_avg, axis=0)
cov_avg = np.cov(obs_avg.T)

这是一种生成平均分布的均值和协方差的实验方法,我认为如果您进行足够多的观察,它应该会给您非常准确的结果。