在不使用np.correlate

时间:2019-03-15 16:36:44

标签: arrays numpy

我正在尝试创建一个使用Hannan-Rissanen算法来计算ARMA(p,q)自回归移动平均随机过程的样本参数的程序。

我遇到的主要困难是计算时间序列的自协方差函数。

程序应采用n×1维列向量Y,并计算出k×1维列向量γ^ hat,由下式给出:

acvf equation image

其中Ybar是Y元素的平均值。

如何有效地计算上述总和? (显然,for循环是可行的,但是我试图在矢量化numpy操作上做得更好)由于我将其用作学习经验,因此,我宁愿不使用除{{1}这样的非常基本的函数以外的任何numpy函数。 }或np.sum

有人问过以下类似的问题,但并不能完全回答我的问题:

Computing autocorrelation of vectors with numpy(使用np.mean

(其他一些人也遇到了使用更高级的np.correlate函数的问题,或者没有像我在这里所说的那样吐出向量。)

1 个答案:

答案 0 :(得分:0)

这里是替换np.correlate的一种方法(我认为这是主要困难;我还假设您不希望手动编写fft):

def autocorr_direct(a, debug=False):
    n, _ = a.shape
    out = np.zeros((n+1, 2*n-1), a.dtype)
    out.reshape(-1)[:2*n*n].reshape(n, 2*n)[::-1, :n] = a*a.T
    if debug:
        print(out.reshape(-1)[:2*n*n].reshape(n, 2*n))
        print(out)
    return out.sum(0)

例如:

>>> a = np.array([[1, 1, 2, -1]]).T
>>> autocorr_direct(a, True)
[[-1 -1 -2  1  0  0  0  0]
 [ 2  2  4 -2  0  0  0  0]
 [ 1  1  2 -1  0  0  0  0]
 [ 1  1  2 -1  0  0  0  0]]
[[-1 -1 -2  1  0  0  0]
 [ 0  2  2  4 -2  0  0]
 [ 0  0  1  1  2 -1  0]
 [ 0  0  0  1  1  2 -1]
 [ 0  0  0  0  0  0  0]]
array([-1,  1,  1,  7,  1,  1, -1])
>>> np.correlate(a[:, 0], a[:, 0], 'full')
array([-1,  1,  1,  7,  1,  1, -1])

请注意剪切正方形数组a[::-1]*a.T的重塑技巧。

注释2;要从一维向量X中获取列向量,请使用X[:, None]