numpy.random.multivariate_normal(均值,协方差[, 大小])

2 投票
1 回答
6999 浏览
提问于 2025-04-17 17:43

numpy.random.multivariate_normal(mean, cov[, size])

我有一个包含N个点和X个维度的数据集。当我计算numpy.mean(data, axis=0)和numpy.cov(data),然后把得到的均值和协方差值放进numpy.random.multivariate_normal(mean, cov)时,出现了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mtrand.pyx", line 3986, in mtrand.RandomState.multivariate_normal (numpy/random/mtrand/mtrand.c:16833)
ValueError: mean and cov must have same length

这是因为numpy.mean()是按列计算均值的,结果是一个X维的数组。而numpy.cov()的输出是一个协方差矩阵,它有N行和X列。有没有人能建议一个解决办法呢?

1 个回答

4

这段话讲的是 numpy.cov 这个函数是怎么理解它的第一个参数的。你现在的数据是每个观察值在一行,而 numpy.cov 其实是希望每个观察值在一列。

要解决这个问题,可以对数据进行转置,也就是用 np.cov(data.T) 这样来得到 X x X 的协方差矩阵:

In [58]: N, X = 100, 3

In [59]: data = np.random.random((N,X))

In [60]: mean = np.mean(data, axis = 0)

In [61]: mean
Out[61]: array([ 0.4913433 ,  0.49484566,  0.52463666])

In [62]: np.cov(data.T).shape
Out[62]: (3, 3)

In [63]: cov = np.cov(data.T)

In [64]: np.random.multivariate_normal(mean, cov)
Out[64]: array([ 0.27194062,  0.65995531,  0.67367201])

另外,你也可以使用 rowval=False 这个参数来解决这个问题:

In [68]: cov = np.cov(data, rowvar=False)

In [69]: cov.shape
Out[69]: (3, 3)

撰写回答