即使对于具有2D高斯的大样本量,样本协方差矩阵也远离真实度

问题描述 投票:0回答:1

这里是一个非常简单的脚本,它生成具有10000点的2D高斯。由np.cov估计的协方差矩阵似乎确实离生成的协方差矩阵很远。有什么解释,有解决方案吗?

import numpy as np
import matplotlib.pyplot as plt

center=[0,0]
npoints=10000
data_covmat = np.array([[1,1],[1,0.5]])
lines=np.random.multivariate_normal(center,data_covmat,npoints)
print(f'2D gaussian centered at {center}, {npoints} points\nCovariance matrix =')
print(data_covmat)
plt.scatter(lines[:,0],lines[:,1],alpha=.1)
plt.axis('scaled')
plt.show()
print(f'Sample covariance matrix =\n{np.cov(lines,rowvar=False)}')

协方差矩阵=

[[1。 1.][1。 0.5]]

样本协方差矩阵=

[[[1.23880367 0.74585136][0.74585136 0.85974812]

python numpy statistics covariance
1个回答
0
投票

[[1,1],[1,0.5]数组不是正半定值。其特征值之一为负。 cov的文档字符串中对multivariate_normal自变量的描述说:“分布的协方差矩阵。对于正确的采样,它必须是对称且正定的。”

[尝试使用[[1,0.6],[0.6,0.5]],它是对称且正定的,并且可以按预期工作:

In [37]: npoints = 10000                                                                                     

In [38]: center = [0, 0]                                                                                     

In [39]: data_covmat = np.array([[1, 0.6], [0.6, 0.5]])                                                       

In [40]: np.linalg.eigvals(data_covmat)                                                                      
Out[40]: array([1.4, 0.1])

In [41]: lines = np.random.multivariate_normal(center, data_covmat, npoints)                                 

In [42]: np.cov(lines, rowvar=False)                                                                         
Out[42]: 
array([[0.99782727, 0.60349542],
       [0.60349542, 0.50179535]])
© www.soinside.com 2019 - 2024. All rights reserved.