Python 从np.random.multivariable_normal重建协方差矩阵时结果不准确
我需要模拟二维正态分布的数据以及相关参数。为此,我使用了Python 从np.random.multivariable_normal重建协方差矩阵时结果不准确,python,numpy,pca,covariance,Python,Numpy,Pca,Covariance,我需要模拟二维正态分布的数据以及相关参数。为此,我使用了np.random.multivariable\u normal和一个协方差矩阵,该协方差矩阵将我的平方sigmas作为对角项,并将sigmas与其他地方的相关系数乘积(我希望这是生成具有相关性的数据的正确方法) 但恐怕我不知道如何从生成的数据中正确地重建协方差矩阵。 我试图用np.cov获得协方差矩阵,并试图将生成的数据简化为零均值形式,然后通过该数据的点积创建协方差矩阵 这是我的密码: import numpy as np from m
np.random.multivariable\u normal
和一个协方差矩阵,该协方差矩阵将我的平方sigmas作为对角项,并将sigmas与其他地方的相关系数乘积(我希望这是生成具有相关性的数据的正确方法)
但恐怕我不知道如何从生成的数据中正确地重建协方差矩阵。
我试图用np.cov
获得协方差矩阵,并试图将生成的数据简化为零均值形式,然后通过该数据的点积创建协方差矩阵
这是我的密码:
import numpy as np
from matplotlib import pyplot as plt
class NormalDist:
def __init__(self, *args):
self.mu = args[:2]
self.sigma = args[2:4]
self.dist, self.cov = None, None
def generate(self, rho=0., n=100):
""" generate distributed data """
self.cov = np.diag(np.array(self.sigma, np.float))
self.cov = np.power(self.cov, 2)
corr = rho * self.sigma[0] * self.sigma[1]
self.cov[0, 1], self.cov[1, 0] = corr, corr
self.dist = np.random.multivariate_normal(self.mu, self.cov, n)
if __name__ == '__main__':
gauss = NormalDist(1, 2, 4, 9)
gauss.generate(1/3)
# covariance matrix from np.cov
print(np.cov(gauss.dist.T), '\n')
# covariance matrix from reducing data to zero-mean form
zero_mean = gauss.dist - gauss.dist.mean(axis=0, keepdims=True)
print(zero_mean.T @ zero_mean)
输出:
[[13.84078951 9.60607718]
[ 9.60607718 79.33658308]]
[[1370.23816181 951.00164066]
[ 951.00164066 7854.32172506]]
您只需除以样本量,即:
def np_mv_cov(X):
X = X - X.mean(axis=0, keepdims=True)
return (X.T @ X) / (X.shape[0] - 1)
可以使用上述代码的简化版本进行测试:
import numpy as np
dist = np.random.multivariate_normal([1, 2], [[16, 12], [12, 81]], 100)
d = np.cov(dist.T) - np_mv_cov(dist)
print(np.max(np.abs(d)))
给我~1.42e-14