numpy.random.multivariate_normal(均值,协方差[, 大小])
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)