【问题标题】:Averaging multivariate normal distributions, extend covariance along a vector平均多元正态分布,沿向量扩展协方差
【发布时间】:2019-03-11 05:47:34
【问题描述】:

如果我有两个独立的多元正态随机变量:

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)的协方差更大。我认为也许取协方差的平均值不是正确的技术?欢迎任何建议,谢谢!

【问题讨论】:

  • 介于这两者之间是什么意思?当你平均两个单位矩阵时,你再次得到单位矩阵。只需以 2D 示例并尝试手动找到符合您要求的协方差。

标签: python scipy statistics probability


【解决方案1】:

我会建议以下方法:

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)

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

【讨论】:

    【解决方案2】:

    这是一个有趣的问题。这样看:协方差分量有一些特定的方向,即 mean1 - mean0 是一个方向,与 mean1 - mean0 正交的平面包含其他方向。在这些方向上,您要指定变化的幅度,即它是正交平面中的某个值(比如说 FOO),而在方向 mean1 - mean0 上则更多(假设是 FOO 的 100 倍)。

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多