Ковариантность матрицы в питоне
Я хочу найти ковариацию матрицы 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)