Ковариантность матрицы в питоне

Я хочу найти ковариацию матрицы 10304*280 (то есть переменную 280, и у каждого есть 10304 субъекта), и я использую следующую функцию numpy, чтобы найти это.

cov = numpy.cov(matrix)

Я ожидаю в результате матрицу 208*280, но она вернула матрицу 10304*10304.

2 ответа

Решение

Как предложено в предыдущем ответе, вы можете изменить расположение вашей памяти. Простой способ сделать это в 2d - это просто транспонировать матрицу:

import numpy as np
r = np.random.rand(100, 10)
np.cov(r).shape # is (100,100)
np.cov(r.T).shape # is (10,10)

Но вы также можете указать rowvar флаг. Читайте об этом здесь:

import numpy as np
r = np.random.rand(100, 10)
np.cov(r).shape # is (100,100)
np.cov(r, rowvar=False).shape # is (10,10)

Я думаю, что особенно для больших матриц это может быть более производительным, так как вы избегаете замены / перемещения осей.

ОБНОВИТЬ:

Я думал об этом и задавался вопросом, действительно ли алгоритм отличается в зависимости от rowvar == True или же rowvar == False, Ну, как выясняется, если вы измените rowvar флаг, numpy просто транспонирует сам массив:P.

Посмотри здесь

Таким образом, с точки зрения производительности, ничего не изменится между двумя версиями.

Вот что numpy.cov(m, y=None..) документ говорит

m: array_like 1-D или 2-D массив, содержащий несколько переменных и наблюдений. Каждая строка m представляет переменную, а каждый столбец - отдельное наблюдение всех этих переменных...

Таким образом, если ваша матрица содержит 280 переменных с 10304 выборками для каждой, она должна быть матрицей 280*10304 вместо 10304*280. Простое решение будет таким же, как предлагают другие.

swap_matrix = numpy.swapaxis(matrix)
cov = numpy.cov(swap_matrix)
Другие вопросы по тегам