为 2D numpy 数组形成协方差矩阵

Forming a Co-variance matrix for a 2D numpy array

我正在尝试找出一种完全矢量化的方法来计算给定基本核函数的 2D numpy 数组的协方差矩阵。例如,如果内核函数 k(x_1,x_2) 的输入为 X = [[a,b],[c,d]],则协方差矩阵将为

K=[[k(a,a),k(a,b),k(a,c),k(a,d)], [k(b,a),k(b,b),k(b,c),k(b,d)], [k(c,a),k(c,b),k(c,c),k(c,d)], [k(d,a),k(d,b),k(d,c),k(d,d)]].

我该怎么做?我对如何重复这些值然后应用该函数以及执行此操作的最有效方法感到困惑。

您可以使用 np.meshgrid 获取两个矩阵,其中包含 k 函数的第一个和第二个参数的值。

In [8]: X = np.arange(4).reshape(2,2)    
In [9]: np.meshgrid(X, X)
Out[9]: 
[array([[0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3]]), 
 array([[0, 0, 0, 0],
        [1, 1, 1, 1],
        [2, 2, 2, 2],
        [3, 3, 3, 3]])]

然后您可以将这些矩阵传递给 k 函数:

In [10]: k = lambda x1, x2: (x1-x2)**2

In [11]: X1, X2 = np.meshgrid(X, X)

In [12]: k(X1, X2)
Out[12]: 
array([[0, 1, 4, 9],
       [1, 0, 1, 4],
       [4, 1, 0, 1],
       [9, 4, 1, 0]])

这是另一种方式

k(X.reshape(-1, 1), X.reshape(1, -1))