Разница между cov и cor между R и Python - PullRequest
0 голосов
/ 02 ноября 2018

Я часто использую 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 разные. Почему?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Если я не перенесу массив в Python, то у меня точно такой же ответ.

Ковариация вычисляется по строке (X[0] возвращает первую строку), и я подозреваю, что R хранит данные в порядке Fortran, тогда как Python / Numpy использует порядок C. Это объясняет разницу с тем, как вычисляется mean, первая ось - строка в Python, а не столбец.

0 голосов
/ 02 ноября 2018

Вы должны передать транспонирование матрицы данных в numpy.cov (), потому что numpy.cov () считает, что его матрица входных данных имеет наблюдения в каждом столбце и переменные в каждой строке. Как вы можете прочитать из документации по np.cov () здесь: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.cov.html

Здесь, в предоставленном коде, если вы передадите Транспонированную матрицу в np.cov (), вы получите те же значения, что и в R, используя cov ().

0 голосов
/ 02 ноября 2018

Это потому, что 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 (по умолчанию), то каждая строка представляет переменная, с наблюдениями в столбцах. В противном случае отношения транспонирован: каждый столбец представляет переменную, а строки содержат наблюдения.

* * R тысяча двадцать-одиной: * * тысяча двадцать две
?cov

var, cov и cor вычисляют дисперсию x и ковариацию или корреляция х и у, если это векторы. Если х и у матрицы затем ковариации (или корреляции) между столбцами из x и столбцы у вычисляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...