python использование corrcoeff для достижения функции corr в Matlab - PullRequest
1 голос
/ 06 мая 2020

После того, как я попробовал все решения, которые нашел в Интернете, я должен спросить здесь.

Я хочу добиться поведения функции matlab's corr:
У меня есть 2 матрицы A и B.
A shape: (200, 30000)
Форма B: (200, 1)

в Matlab, corr(A, B) вернет матрицу с размером (30000, 1). когда я использую numpy.corrcoef (или dask для лучшей производительности), я получаю матрицу (30001, 30001), которая чрезвычайно велика и дает неправильный ответ. Я попытался использовать аргумент rowvar=False в качестве предложенного ответа, но он тоже не сработал.

Я даже попробовал scipy.spatial.distance.cdist(np.transpose(traces), np.transpose(my_trace), metric='correlation'), который действительно вернул матрицу в форме (30000, 1), как и ожидалось, но значения были разными rnet затем результат в matlab.

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

1 Ответ

4 голосов
/ 06 мая 2020

Matlab's corr по умолчанию вычисляет корреляцию столбцов A и B, а Python * corrcoef вычисляет корреляцию строк внутри массива (если вы передаете функции два массива, она похоже, он будет делать то же самое с вертикально сложенными массивами). Если вам не важна производительность и вам нужно найти простой способ сделать это, вы можете сложить два массива по горизонтали, вычислить корреляцию и получить соответствующие элементы, которые вам нужны:

correlation = np.corrcoef(np.hstack((B,A)),rowvar=False)[0,1:]

Но если вам все равно Если говорить о производительности больше, чем о простых кодах, вам придется реализовать функцию corr самостоятельно. (Прокомментируйте, и я добавлю его, если это то, что вы ищете)

ОБНОВЛЕНИЕ : если вы хотите реализовать corr, чтобы предотвратить дополнительные вычисления / использование памяти, вы можете рассчитать корреляцию, используя ее формулу, сначала нормализовав массивы, а затем умножив их:

A = (A - A.mean(axis=0))/A.std(axis=0)
B = (B - B.mean(axis=0))/B.std(axis=0)
correlation = (np.dot(B.T, A)/B.shape[0])[0]

вывод примера кода:

A = np.array([1,2,2,2]).reshape(4,1)
B = np.arange(20).reshape(4,5)

Python: np.corrcoef(np.hstack((A,B)),rowvar=False)[0,1:]

[0.77459667 0.77459667 0.77459667 0.77459667 0.77459667]

Matlab:  corr(A,B)

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