python - 平均多元正态分布,沿向量扩展协方差
问题描述
如果我有两个单独的多元正态随机变量:
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)的协方差更大。我认为也许取协方差的平均值不是正确的技术?欢迎任何建议,谢谢!
解决方案
这是一个有趣的问题。这样看:协方差分量有一些特定的方向,即 mean1 - mean0 是一个方向,与 mean1 - mean0 正交的平面包含其他方向。在这些方向上,您要指定变化的幅度,即它是正交平面中的某个值(比如说 FOO),而在方向 mean1 - mean0 上则更多(假设是 FOO 的 100 倍)。
您可以通过 Gram-Schmidt 算法或其他方法找到正交平面的基础。此时您可以构造一个协方差矩阵:让 S = 您找到的方向的列(即 mean1 - mean 加上正交平面的基础),让 D = 100 FOO, FOO, FOO, 的对角矩阵。 ..,对角线上的 FOO。现在 SDS^T(其中 S^T 是矩阵转置)是具有所需属性的正定矩阵。
您也许可以避免 Gram-Schmidt,但在任何情况下您的目标都是相同的:指定您想要的属性,然后构造一个矩阵来满足它们。
推荐阅读
- wso2 - 根据错误消息配置故障顺序
- python - 在 Python 3 中执行 x = input ("input x:" ) 时获取 EOFError
- java - 给定一个字符串,找到所有数字排列(子字符串),同时保持值的顺序和范围(解码字符串)
- elasticsearch - 具有不受支持的参数的根映射定义
- .net-core - 无法将调试日志记录输出到控制台
- c# - RoutedEventArgs.OriginalSource 是如何计算的?
- excel - 我需要重新排列 Excelsheet 中的数据
- azure - 如何在 Azure Batch Pool 中使用 Azure 共享库 VM 映像
- docker - Gitlab CE:如何配置 Docker 注册表
- android - Android ButterKnife @OnClick() 不能正常工作所有依赖都可以