2013-11-21 2 views

답변

4

을 갖는 방정식으로 표현 될 수있다 :

k 샘플 의해 x(i) 신호의 변화를 의미 k 소정의 신호 (즉, 특정한 1 차원 벡터)이다

는 ... Nx(i) 신호의 길이이며 :

enter image description here

... 단순 평균 인 우리가 쓸 수 있습니다 :

''' 
Calculate the autocovarriance coefficient. 
''' 

import numpy as np 

Xi = np.array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]) 
N = np.size(Xi) 
k = 5 
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 

print("Autocovariance:", autocovariance(Xi, N, k, Xs)) 

을 당신이 좋아하면 방금 위의 코드에 추가 단지 두 개의 추가 라인이보다 ...

enter image description here

:

def autocorrelation(): 
    return autocovariance(Xi, N, k, Xs)/autocovariance(Xi, N, 0, Xs) 

을 여기에 그대로 표현 된 자기 상관 계수가 될 자기 공분산 계수를 정상화 전체 스크립트를

''' 
Calculate the autocovarriance and autocorrelation coefficients. 
''' 

import numpy as np 

Xi = np.array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]) 
N = np.size(Xi) 
k = 5 
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("Autocovariance:", autocovariance(Xi, N, k, Xs)) 
print("Autocorrelation:", autocorrelation()) 
+0

Numpy는 이미 [상관 관계] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.correlate.html)를 계산하는 데 필요한 모든 것을 갖추고 있습니다. ([scipy.signal.fftconvolve] (http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.signal.fftconvolve.html)로 가속화 할 수 있습니다.) 자기 공분산을 얻으려면 [분산] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html)을 곱해야합니다. – Celelibi

1

가져 오기 샘플 자동 공분산 :

# cov_auto_samp(X,delta)/cov_auto_samp(X,0) = auto correlation 
def cov_auto_samp(X,delta): 
    N = len(X) 
    Xs = np.average(X) 
    autoCov = 0.0 
    times = 0.0 
    for i in np.arange(0, N-delta): 
     autoCov += (X[i+delta]-Xs)*(X[i]-Xs) 
     times +=1 
    return autoCov/times 
0

파이썬 for 루프를 피하고 대신 numpy 배열 연산을 사용하는 이전 답변에 대한 약간의 조정. 많은 양의 데이터가 있으면이 방법이 더 빠릅니다. 50,000 데이터 포인트의 시계열을 이용하여 래그의 한 고정 값에 대해 자기 상관을 계산하는 @bluevoxel의 코드에 대해,이 비교

def lagged_auto_cov(Xi,t): 
    """ 
    for series of values x_i, length N, compute empirical auto-cov with lag t 
    defined: 1/(N-1) * \sum_{i=0}^{N-t} (x_i - x_s) * (x_{i+t} - x_s) 
    """ 
    N = len(time_series) 

    # use sample mean estimate from whole series 
    Xs = np.mean(Xi) 

    # construct copies of series shifted relative to each other, 
    # with mean subtracted from values 
    end_padded_series = np.zeros(N+t) 
    end_padded_series[:N] = Xi - Xs 
    start_padded_series = np.zeros(N+t) 
    start_padded_series[t:] = Xi - Xs 

    auto_cov = 1./(N-1) * np.sum(start_padded_series*end_padded_series) 
    return auto_cov 

가 파이썬 for 루프 코드가 약 30 밀리 초를 평균화 numpy 배열을 사용하는 것은 평균 0.3 밀리 초 (내 노트북에서 실행)보다 평균.

관련 문제