Мне удалось написать несмещенную функцию автокорреляции для 1d - массивов:
import numpy as np
def autocorr(x):
x_norm = (x - x.mean())/x.std()
result = np.correlate(x_norm, x_norm, mode='full')
vec_unbi = np.array([x.size - abs(i) for i in range(0, x.size)])
return result[result.size//2:]/x.size
def autocorr_unbiased(x):
vec_unbi = np.array([x.size - abs(i) for i in range(0, x.size)])
return x.size*autocorr(x)/vec_unbi
, который хорошо работает:
N_samples = 1000
t = np.linspace(0,1000,N_samples)
y = np.sin(2*np.pi*t/200)
plt.figure()
plt.plot(autocorr(y), label = 'biased')
plt.plot(autocorr_unbiased(y), label = 'unbiased')
plt.legend()
plt.savefig('test.png')
plt.show()
Теперь у меня есть 2d функция автокорреляции:
from scipy.signal import fftconvolve
def autocorr2D(A):
return fftconvolve(A,A[::-1, ::-1])
Что смещено:
x = np.linspace(0,500,500)
y = np.linspace(0,500,500)
X, Y = np.meshgrid(y,x)
h = np.sin((2*np.pi/100)*(np.cos(np.pi/3)*X + np.sin(np.pi/3)*Y))
plt.figure()
plt.contourf(autocorr2D(h))
plt.show()
Как мне сместить это, чтобы соответствовать теоретической статистической автокорреляции моего 2D-синуса?