Понимание вывода np.corrcoef для двух матриц разного размера

Я хотел бы вычислить корреляцию между каждым вектором-столбцом матрицы A с каждым вектором-столбцом матрицы B.

Рассмотреть возможность:

vectorsize = 777 
A = np.random.rand(vectorsize, 64)
B = np.random.rand(vectorsize, 36)
corr = np.corrcoef(A, B, rowvar=False)

Результатом np.corrcoef в этом случае будет матрица 100x100. Что это значит?

Интуитивно я ожидал получить матрицу 64x36.


person dangom    schedule 20.10.2017    source источник
comment
Повторяющийся вопрос действительно показывает мне, как делать то, что я хочу, но он не приближает меня к пониманию вывода np.corrcoef, который был моим первоначальным вопросом.   -  person dangom    schedule 20.10.2017
comment
Ага, давайте подождем, пока гуру NumPy напишут объяснение.   -  person Divakar    schedule 20.10.2017


Ответы (2)


Если метод corrcoef получает два массива x и y, он складывает их (по вертикали, если rowVar имеет значение True, по горизонтали, если rowVar имеет значение False). В источнике:

if y is not None:
    y = array(y, copy=False, ndmin=2, dtype=dtype)
    if not rowvar and y.shape[0] != 1:
        y = y.T
    X = np.vstack((X, y))

С точки зрения статистики, он считает, что A имеет 64 переменных (в столбцах, поскольку rowVar имеет значение false), а B - 36. Их складывание дает вам 100 переменных, следовательно, корреляционная матрица 100 на 100.

Матрица корреляции всегда симметрична (и положительно полуопределена). Если вам нужны корреляции только между переменными x и y, они находятся в недиагональном блоке размером 64 на 36: извлеките его с нарезкой. Вот структура вывода:

 corr(x, x), size 64 by 64  |  corr(x, y), size 64 by 36
 ---------------------------+---------------------------
 corr(y, x), size 36 by 64  |  corr(y, y), size 36 by 36
person Community    schedule 20.10.2017

Как rowvar=False он вычисляет корреляции между столбцами. Поэтому он вычисляет коэффициент корреляции Пирсона между каждым столбцом A с самим собой и каждым другим столбцом B. Это то же самое, что вы объединяете две матрицы и вычисляете корреляцию между ее столбцами, как показано ниже:

C = np.hstack([A, B])   # C.shape[0] == A.shape[0] == B.shape[0] and C.shape[1] = A.shape[1] + B.shape[1]

corr_C = np.corrcoef(C, rowvar=False)

np.allclose(corr_C, corr)   # Returns True
person xboard    schedule 20.10.2017