我经常使用 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 4M = colMeans(X) # apply(X,2,mean)M# [1] 1.500000 7.333333 4.666667S = 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.333333R = 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 npX = np.array([1,0.5,3,7,9,6,2,8,4]).reshape(3, 3)X = np.transpose(X) # byrow=FALSEX# array([[ 1. , 7. , 2. ], # [ 0.5, 9. , 8. ], # [ 3. , 6. , 4. ]])M = X.mean(axis=0) # colMeansM# 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的结果就不一样了。为什么?
3 回答

慕妹3242003
TA贡献1824条经验 获得超6个赞
这是因为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]])
各自的文档(强调我的)中解释了差异:
Python:
help(np.cov)
rowvar : bool,可选 如果
rowvar
为 True(默认),则每一行代表一个变量,在列中观察。否则,关系被转置:每一列代表一个变量,而行包含观察。
回复:
?cov
var、cov 和 cor 计算 x 的方差以及 x 和 y 的协方差或相关性(如果它们是向量)。如果x和y是矩阵,则之间的协方差(或相关性)列X和Y的列计算的。

精慕HU
TA贡献1845条经验 获得超8个赞
如果我不在 Python 中转置数组,那么我会得到完全相同的答案。
协方差是按行计算的(X[0]
返回第一行),我怀疑 R 以 Fortran 顺序存储数据,而 Python/Numpy 使用 C 顺序。这解释了mean
计算方式的不同,第一个轴是 Python 中的行,而不是列。
添加回答
举报
0/150
提交
取消