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.:
CodeCogsEqn1.png
...oraz jego wersję znormalizowaną dla wskaźnika autokorelacji:
CodeCogsEqn2.png

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} :)


The quieter you become, the more you are able to hear.