Я получил два сигнала S1 и S2 (два массива значений), и я хотел бы знать, является ли S1 тем же сигналом, что и S2, но сдвинут (графическое представление будет одинаковым для S1 и S2, но S1 будет перемещено вправо или оставил)
Проблема заключается в следующем: My scipy.interpolate.interp1d
содержит интерполяцию scipy.interpolate.interp1d
, и эта функция scipy.interpolate.interp1d
значения NaN в массивы.
Когда я пытаюсь соотнести S1 и S2 с NaN внутри, корреляционная матрица всегда [NaN, NaN, NaN,..., NaN, NaN, NaN]
Моя цель: 1) Обнаружить, если S1 и S2 - один и тот же сигнал (если корреляция выше определенного порога, я буду считать, что они являются одним и тем же сигналом). 2) Если есть, обнаружите смещение между ними, вы сможете удалить его
Чтобы проиллюстрировать мой алгоритм, я создал простой код
import numpy as np
from scipy.signal import correlate
norm = np.linalg.norm
x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])
corr = correlate(x, y)
print(corr/(norm(x)*norm(y)))
Здесь корреляционная функция - scipy.signal.correlate
но я пробовал с np.correlate тоже, и я получил те же результаты
Из сообщения stackoverflow я пробовал так:
x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])
normx = norm(x[~np.isnan(x)])
normy = norm(y[~np.isnan(y)])
maskx = np.ma.array(x, mask=np.isnan(x))
masky = np.ma.array(y, mask=np.isnan(y))
corr = correlate(maskx, masky)
Но у меня все еще есть значения NaN.
Есть ли что-то, что я делаю неправильно?
Если какой-либо из сигналов содержит NaN, то retusrn будет все NaN.
Используйте это, чтобы сначала удалить nans, а затем использовать функцию корреляции:
x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])
x = x[~np.isnan(x)]
y = y[~np.isnan(y)]
corr = np.corrcoef(x, y)
#corrcoef returns the normalised covariance matrix so you want the [1,0] or [0,1] element of this matrix
print(corr[1,0])
#1.0
numpy.correlate
- это numpy.correlate
корреляция двух одномерных последовательностей. С другой стороны, numpy.corrcoef
возвращает коэффициенты корреляции Пирсона и момента произведения. Вы можете использовать любое измерение, которое вы хотите. В своем ответе я просто продемонстрировал, как избавиться от NaNs