Как я могу автоматически определить периодичность с помощью автокорреляции?

Это мой код:

import matplotlib.pyplot as plt
import numpy as np
from pandas.plotting import autocorrelation_plot

y = np.sin(np.arange(1,6*3.14,0.1))
autocorrelation_plot(y)
plt.show()

И это вывод графика автокорреляции:

автокорреляционный участок у

Я хотел бы выяснить способ классификации, является ли функция периодической или нет автоматически (без использования невооруженным глазом для просмотра графика автокорреляции). Я читал, что он связан с доверительным интервалом, который является линией, показанной на прилагаемом графике, но все еще сомневаюсь, что мне следует делать с ним, чтобы лучше принять решение. Так есть ли автоматизированный способ использования автокорреляции для определения перидиодичности данных?

Хотя, это моя попытка автоматизированного способа:

result = np.correlate(y, y, mode = "full")
ACF = result[np.round(result.size/2).astype(int):]
ACF = ACF/ACF[0]
acceptedVar = []
for i in range(len(ACF)):
    if ACF[i] > 0.05:
        acceptedVar = np.append(acceptedVar, ACF[i])

percent = len(acceptedVar)/len(ACF) * 100

Я просто сделал порог 0,05, чтобы определить точки, для которых доверительный интервал составляет 95%. Не знаю, правильно это или нет статистически и логически. Затем я вижу, если процент больше, чем 95% для периодической модели. Я тоже не уверен в этом.

Кредит: первый ответ на Как я могу использовать numpy.correlate для автокорреляции?

1 ответ

Для начала, например, вы можете использовать чтобы напрямую использовать значения из функции автокорреляции pandas.

Это может быть несколько наивным решением, но, если вы просто ищете первую, наиболее значительную периодичность, вы можете просто взять первый индекс наивысшего пика на графике:

      first_max = np.argmax(autocorr) + 1

Это дает вам лаг, для которого автокорреляция самая высокая = интересующий период (в единицах интервала выборки ваших данных).

Допустим, вам нужен следующий наиболее значительный период:

      second_max = np.argmax(autocorr[first_max:]) + first_max + 1

И так далее...

Примечание: это не сработает, если ваши данные не такие регулярные и периодические, как кажется на графике автокорреляции.

Другие вопросы по тегам