我正在使用三维numpy阵列,最终我将在这些阵列上执行PCA。我首先将三维阵列展平为二维,以便计算协方差(然后是特征值和特征向量)。
在计算协方差矩阵时,我使用numpy.cov和numpy.dot得到了不同的结果。如果我的二维数组是(5,9),我想得到一个5x5(即NxN)协方差矩阵。这就是我用numpy.dot得到的。对于numpy.cov,我得到的协方差矩阵是9x9。这不符合我需要的形状,但老实说,我不知道哪一个是正确的。在我所研究的例子中,我看到了两种计算协方差的方法。
如果我通过numpy.linalg.eig计算携带numpy.dot与numpy.cov,我显然会得到不同的答案(都在下面的示例输出中打印)。所以,在这一点上,我很困惑哪种方法是正确的,或者我可能会错在哪里。
这是输出的测试代码。谢谢你的帮助。import numpy as np
a = np.random.random(((5,3,3))); # example of what real input will look like
# create 2D flattened version of 3D input array
d1,d2,d3 = a.shape
b = np.zeros([d1,d2*d3])
for i in range(len(a)):
b[i] = a[i].flatten()
print "shape of 3D array: ", a.shape
print "shape of flattened 2D array: ", b.shape, "\n"
print "flattened 2D array:\n", b, "\n"
# mean-center the flattened array
b -= np.mean(b, axis=0)
# calculate the covariance matrix of the flattened array
covar1 = np.cov(b, rowvar=0) # this makes a 9x9 array
covar2 = np.dot(b, b.T) # this makes a 5x5 array
print "covariance via numpy.cov:\n", covar1, "\n"
print "covariance via numpy.dot:\n", covar2, "\n"
# calcul