Ковариантность матрицы в питоне - PullRequest
0 голосов
/ 20 сентября 2018

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

cov = numpy.cov(matrix)

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Как предложено в предыдущем ответе, вы можете изменить расположение вашей памяти.Простой способ сделать это в 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.

Смотрите здесь .

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

0 голосов
/ 20 сентября 2018

вот что говорит 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)
...