我经常使用R,但是我是Python的新手。 在R中,演示给定矩阵的均值,cov和cor的计算 给出如下:
X = matrix(c(1,0.5,3,7,9,6,2,8,4), nrow=3, ncol=3, byrow=FALSE)
X
# [,1] [,2] [,3]
# [1,] 1.0 7 2
# [2,] 0.5 9 8
# [3,] 3.0 6 4
M = colMeans(X) # apply(X,2,mean)
M
# [1] 1.500000 7.333333 4.666667
S = cov(X)
S
# [,1] [,2] [,3]
# [1,] 1.75 -1.750000 -1.500000
# [2,] -1.75 2.333333 3.666667
# [3,] -1.50 3.666667 9.333333
R = cor(X)
R
# [,1] [,2] [,3]
# [1,] 1.0000000 -0.8660254 -0.3711537
# [2,] -0.8660254 1.0000000 0.7857143
# [3,] -0.3711537 0.7857143 1.0000000
我想用Python复制上面的内容,然后尝试:
import numpy as np
X = np.array([1,0.5,3,7,9,6,2,8,4]).reshape(3, 3)
X = np.transpose(X) # byrow=FALSE
X
# array([[ 1. , 7. , 2. ],
# [ 0.5, 9. , 8. ],
# [ 3. , 6. , 4. ]])
M = X.mean(axis=0) # colMeans
M
# array([ 1.5 , 7.33333333, 4.66666667])
S = np.cov(X)
S
# array([[ 10.33333333, 10.58333333, 4.83333333],
# [ 10.58333333, 21.58333333, 5.83333333],
# [ 4.83333333, 5.83333333, 2.33333333]])
R = np.corrcoef(X)
R
# array([[ 1. , 0.70866828, 0.98432414],
# [ 0.70866828, 1. , 0.82199494],
# [ 0.98432414, 0.82199494, 1. ]])
则cov和cor的结果不同。为什么?
答案 0 :(得分:3)
这是因为numpy
按行计算,R
按列计算。注释掉X = np.transpose(X) # byrow=FALSE
,或使用np.cov(X, rowvar=False)
。
np.cov(X, rowvar=False)
array([[ 1.75 , -1.75 , -1.5 ],
[-1.75 , 2.33333333, 3.66666667],
[-1.5 , 3.66666667, 9.33333333]])
差异在相应的文档中进行了说明(重点是我的):
help(np.cov)
rowvar:布尔值,可选 如果
rowvar
为True(默认),则每个 行 代表一个 变量,在列中具有观察值。否则关系 进行转置:每一列代表一个变量,而行 包含观察结果。
?cov
var,cov和cor计算x的方差以及协方差或 如果它们是向量,则x和y的相关性。如果x和y是矩阵 然后x的 列 之间的协方差(或相关性) y的列被计算。
答案 1 :(得分:2)
如果我不使用Python转置数组,那么我将得到完全相同的答案。
协方差是按行计算的(X[0]
返回第一行),我怀疑R以Fortran顺序存储数据,而Python / Numpy使用C顺序。这说明了mean
的计算方式的不同,第一个轴是Python中的行,而不是列。
答案 2 :(得分:1)
您必须将数据矩阵的转置传递给numpy.cov(),因为numpy.cov()认为其输入数据矩阵在每一列中都有观察值,在每一行中都有变量。您可以从np.cov()的文档中读取以下内容: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.cov.html
如果您将转置矩阵传递给np.cov(),则在提供的代码中,将获得与使用cov()在R中获得的值相同的值。