Как я могу автоматически определить периодичность с помощью автокорреляции?
Это мой код:
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 ответ
Для начала, например,
Это может быть несколько наивным решением, но, если вы просто ищете первую, наиболее значительную периодичность, вы можете просто взять первый индекс наивысшего пика на графике:
first_max = np.argmax(autocorr) + 1
Это дает вам лаг, для которого автокорреляция самая высокая = интересующий период (в единицах интервала выборки ваших данных).
Допустим, вам нужен следующий наиболее значительный период:
second_max = np.argmax(autocorr[first_max:]) + first_max + 1
И так далее...
Примечание: это не сработает, если ваши данные не такие регулярные и периодические, как кажется на графике автокорреляции.