Python - взаимная корреляция двух массивов с входами nan внутри - PullRequest
0 голосов
/ 10 октября 2018

Я получил два массива данных, которые я хочу кросс-коррелировать, и получил длину задержки (если есть) между двумя массивами, а затем нормализовал ее между 0 и 1. Например:

import numpy as np

x = [0,1,1,1,2,0,0]
y = [0,0,0,1,1,1,2]
corr = np.correlate(a,b, 'full')

norm = np.linalg.norm
normalized = corr/(norm(a)*norm(b))

возвращает:

[0.0, 0.0, 0.29, 0.43, 0.57, 1.0, 0.57, 0.43, 0.29, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

Проблема в том, что мне нужно соотнести две графики, и массив X не является регулярным (и не одинаковым для двух массивов, есть только некоторые связанные значения yдо некоторого значения x), поэтому я интерполирую данные до сопоставления с scipy.interpolate.interp1d, и это приводит к появлению записей NaN в моем массиве.В этот момент корреляционная функция возвращает только NaN

Например:

import numpy as np

x = [0,1,1,1,2,0,np.nan]
y = [np.nan,0,0,1,1,1,2]
corr = np.correlate(a,b, 'full')

norm = np.linalg.norm
normalized = corr/(norm(a)*norm(b))

возвращает:

[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]

Я наконец понял, что получаю это, потому что норма (а)Результаты NaN, мой вопрос: как я могу просто игнорировать эти значения NaN, есть ли лучший способ взаимной корреляции двух массивов?Я уже тестировал запуск interp1d с fill_value='extrapolate', но это вызывает проблемы в расчете корреляции.Есть ли другое значение, которое я могу передать в fill_value, которое будет «игнорировать» пропущенные значения в данных?

Кроме того, np.correlate(x,y) возвращает NaN, но если мы посмотрим на np.correlate(x,y,'full'), то на самом деле вернет [ 0. 0. 2. 3. 4. 7. 4. nan nan nan nan nan nan nan nan], Почему NumPy принимает NaN в качестве максимального значения?

1 Ответ

0 голосов
/ 10 октября 2018

Прежде всего, замените значения NAN, возможно, средним значением или режимом остальных элементов.Это самая наивная техника.Как работать с NAN - это совсем другой вопрос.Вы можете использовать np.nanmean() для этой цели.

Коррелят Нампи - не то, что вы ищете.

Из документации:

Кросс-корреляция двух 1последовательности.

Эта функция вычисляет корреляцию, как обычно определяется в текстах обработки сигналов:

c_ {av} [k] = sum_n a [n + k] * con (v [n])

Вам лучше взглянуть на коэффициент корреляции Пирсона, который является мерой линейной корреляции между двумя переменными X и Y.

from scipy.stats.stats import pearsonr   

x = [0,1,1,1,2,0,np.nan]
y = [np.nan,0,0,1,1,1,2]
corr = pearsonr(x,y, 'full')

или вы также можете использовать

numpy.corrcoef(x,y)

, который возвращает двумерный массив, объясняющий корреляцию между двумя (или более) массивами.

...