Ucząc się Pythona implementuję sobie różne funkcje. Jedną z nich jest funkcja obliczająca wskaźnik autokorelacji dla danego wektora Xi
i danego przesunięcia k
. Pozwolę sobie najpierw wkleić kod i pod nim opiszę o co chodzi:
'''
Calculate the autocorrelation coefficient.
'''
import numpy as np
Xi = np.array([1, 2, 3])
N = np.size(Xi)
k = 2
Xs = np.average(Xi)
def autocovariance(Xi, N, k, Xs):
autoCov = 0
for i in np.arange(0, N-k):
autoCov += (Xi[i+k]-Xs)*(Xi[i]-Xs)
return (1/(N-1))*autoCov
def autocorrelation():
return autocovariance(Xi, N, k, Xs) / autocovariance(Xi, N, 0, Xs)
print("Autocorrelation:", autocorrelation())
Powyższa funkcja jest zaimplementowana w zgodzie z wzorem na autokowariancję obliczaną dla sygnałów dyskretnych, tj.:
...oraz jego wersję znormalizowaną dla wskaźnika autokorelacji:
Problem jaki napotykam to kwestia wyniku, jaki powyższa funkcja mogłaby zwracać. Przyjrzałem się bowiem funkcji np.correlate()
, która dla wartości parametru mode='full'
dla trójelementowego zbioru zwraca pięcioelementowy jednowymiarowy wektor. Na stronie, z której uczę się wzorów, jest podane zadanko, które poleca napisanie funkcji autokorelacji, która dla zbioru [1, 2, 3]
przesuniętego o 2
zwróci w wyniku wektor [-0.5, 0, 1, 0, 0.5]
. I tu moje pytanie - w jaki sposób funkcja autokorelacji może zwrócić w wyniku wektor? Jak można by to zaimplementować? Będę bardzo wdzięczny za odpowiedzi.
UPDATE 14.12.2014, 18:11
Problem rozwiązany. Okazało się, że niepotrzebnie kombinowałem ponad miarę. W celu uzyskania wektora autokorelacji wystarczyło po prostu zmierzyć wartość powyższej dla zakresu przesunięć <|-k|;k>, dla k należącego do N+ suma {0}
:)