Wynika to z różnych wspólnych definicji między statystyk i przetwarzania sygnału. Zasadniczo definicja przetwarzania sygnału zakłada, że będziesz obsługiwać odrywanie. Definicja statystyczna zakłada, że odjęcie średniej to całkowite odejście, które zrobisz, i robi to za ciebie.
Po pierwsze, niech wykazać problem z samodzielnym przykład:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.graphics import tsaplots
def label(ax, string):
ax.annotate(string, (1, 1), xytext=(-8, -8), ha='right', va='top',
size=14, xycoords='axes fraction', textcoords='offset points')
np.random.seed(1977)
data = np.random.normal(0, 1, 100).cumsum()
fig, axes = plt.subplots(nrows=4, figsize=(8, 12))
fig.tight_layout()
axes[0].plot(data)
label(axes[0], 'Raw Data')
axes[1].acorr(data, maxlags=data.size-1)
label(axes[1], 'Matplotlib Autocorrelation')
tsaplots.plot_acf(data, axes[2])
label(axes[2], 'Statsmodels Autocorrelation')
pd.tools.plotting.autocorrelation_plot(data, ax=axes[3])
label(axes[3], 'Pandas Autocorrelation')
# Remove some of the titles and labels that were automatically added
for ax in axes.flat:
ax.set(title='', xlabel='')
plt.show()
Więc dlaczego do cholery ja mówię, że są one poprawne? Są wyraźnie różne!
Załóżmy napisać własną funkcję autokorelacji wykazać co plt.acorr
robi:
def acorr(x, ax=None):
if ax is None:
ax = plt.gca()
autocorr = np.correlate(x, x, mode='full')
autocorr /= autocorr.max()
return ax.stem(autocorr)
Gdybyśmy działki to z naszych danych, będziemy mieć bardziej lub mniej identyczny wynik plt.acorr
(jestem pozostawiając prawidłowo oznakowania LGD, po prostu dlatego, że jestem leniwy):
fig, ax = plt.subplots()
acorr(data)
plt.show()
jest to doskonale val id autokorelacja. Wszystko zależy od tego, czy twoje tło jest przetwarzaniem sygnału, czy statystyką.
Jest to definicja używana w przetwarzaniu sygnału. Założono, że poradzisz sobie z detekcją danych (zanotuj numer detrend
kwarg w plt.acorr
). Jeśli chcesz go odrzucić, zdecydowanie go poprosisz (i prawdopodobnie zrobisz coś lepszego niż odjęcie średniej), a inaczej nie należy zakładać.
W statystykach przyjmuje się po prostu, że odjęcie średniej jest tym, co chcemy zrobić dla oderwania.
Wszystkie pozostałe funkcje są odjęcie średniej z danych przed korelacji, podobnego do tego:
def acorr(x, ax=None):
if ax is None:
ax = plt.gca()
x = x - x.mean()
autocorr = np.correlate(x, x, mode='full')
autocorr /= autocorr.max()
return ax.stem(autocorr)
fig, ax = plt.subplots()
acorr(data)
plt.show()
Jednak wciąż mamy jedną dużą różnicę. Ta jest czysto spiskowa.
W większości podręczników do przetwarzania sygnałów (które widziałem, tak), wyświetlana jest "pełna" autokorelacja, tak że zerowe opóźnienie znajduje się pośrodku, a wynik jest symetryczny z każdej strony. Z drugiej strony R ma bardzo rozsądną konwencję do wyświetlania tylko jednej strony. (Wszakże druga strona jest całkowicie zbędna.) Funkcje statystyczne funkcji kreślenia są zgodne z konwencją R, i plt.acorr
następuje po tym, co robi Matlab, który jest przeciwną konwencją.
zasadzie, że chcesz to:
def acorr(x, ax=None):
if ax is None:
ax = plt.gca()
x = x - x.mean()
autocorr = np.correlate(x, x, mode='full')
autocorr = autocorr[x.size:]
autocorr /= autocorr.max()
return ax.stem(autocorr)
fig, ax = plt.subplots()
acorr(data)
plt.show()
To pytanie wydaje się być nie na temat, ponieważ jest to raport o błędzie –
Nie tylko raporty o błędach nie należą na SO, ale twoja przykład nie jest możliwy do przeprowadzenia ('mydata' jest niezdefiniowany i brakuje importu) a twoje wykresy są chronione hasłem. Nie wiesz, jakiego rodzaju odpowiedzi oczekujesz. Jeśli chcesz poprawić to pytanie, zalecam skupienie się na pytaniu, co właściwie robi konkretna funkcja. Istnieje szansa, że matplotlib przyjmuje inne, ale równie odpowiednie podejście. –
Teraz powinno być dobrze. Nie mogę tu umieścić wykresu, ponieważ obraz jest podobny do http://quant365.com/download/file.php?id=5, którego nie można tutaj opublikować. –