Я хотел бы вычислить автокорреляцию оценка в python. Если массив не имеет значений NAN, автокорреляция может быть вычислена явно с помощью
def autocorr_naive(x):
N = len(x)
return np.array([np.mean(x[iSh:] * x[:N-iSh]) for iSh in range(N)])
или с помощью функции numpy correlate
def autocorr_numpy(x):
N = len(x)
return np.correlate(x, x, 'full')[N-1:] / N
Функция numpy значительно быстрее, чем рукописный, предположительно потому, что он использует теорему Винера-Хинчина или аналогичную для эффективной аппроксимации корреляции.
Проблема заключается в том, что numpy. коррелят в настоящее время, по-видимому, не обрабатывает корреляции , если в перекрытии присутствуют значения NAN. Наивное расширение для обработки значений NAN просто игнорирует их при вычислении среднего значения
def autocorr_naive_nan(x):
N = len(x)
return np.array([np.nanmean(x[iSh:] * x[:N-iSh]) for iSh in range(N)])
Наивное расширение имеет две проблемы. Во-первых, он мучительно медленный по сравнению с реализацией numpy. Во-вторых, у него много нежелательных покачиваний на хвосте, где перекрытие состоит всего из нескольких точек, и оценка, естественно, плохая. Аппроксимация на основе БПФ, используемая в numpy, кажется, не смещена этими артефактами, по крайней мере, в той же степени.
Pragmati c Вопрос : Есть ли библиотека I можно использовать для вычисления эквивалента autocorr_naive_nan
эффективным способом?