我希望计算具有权重的p个量的n次测量的协方差C,其中每个单独的量测量都有自己的权重。也就是说,我的权重数组W与我的数量数组Q(n乘以p)具有相同的形状。原生的np.cov()函数仅支持针对单个测量给出权重(即长度为n的向量)。
我可以初始化一个p乘以p的矩阵并进行迭代,但如果p很大,则这是一个非常缓慢的过程。
由于已知每个量(Q的列)的平均值为零,因此C的每个元素的显式公式为:
如果我将分子重新排列为
有没有一种使用
为测试,让我们定义以下内容:
我可以初始化一个p乘以p的矩阵并进行迭代,但如果p很大,则这是一个非常缓慢的过程。
由于已知每个量(Q的列)的平均值为零,因此C的每个元素的显式公式为:
C[i,j] = np.sum(
Q[:, i] * Q[:, j] * W[:, i] * W[:, j]) / np.sum(W[:, i] * W[:, j])
如果我将分子重新排列为
Q [:,i] * W [:,i] * Q [:,j] * W [:,j]
,似乎我应该能够对Q * W
的列进行乘法和求和,然后以类似的方式处理分母(除了使用W * W
)。有没有一种使用
np.einsum()
实现这个功能的方法?为测试,让我们定义以下内容:
C = array([[ 1. , 0.1 , 0.2 ], # set this beforehand, to test whether
[ 0.1 , 0.5 , 0.15], # we get the correct result
[ 0.2 , 0.15, 0.75]])
Q = array([[-0.6084634 , 0.16656143, -1.04490324],
[-1.51164337, -0.96403094, -2.37051952],
[-0.32781346, -0.19616374, -1.32591578],
[-0.88371729, 0.20877833, -0.52074272],
[-0.67987913, -0.84458226, 0.02897935],
[-2.01924756, -0.51877396, -0.68483981],
[ 1.64600477, 0.67620595, 1.24559591],
[ 0.82554885, 0.14884613, -0.15211434],
[-0.88119527, 0.11663335, -0.31522598],
[-0.14830668, 1.26906561, -0.49686309]])
W = array([[ 1.01133857, 0.91962164, 1.01897898],
[ 1.09467975, 0.91191381, 0.90150961],
[ 0.96334661, 1.00759046, 1.01638749],
[ 1.04827001, 0.95861001, 1.01248969],
[ 0.91572506, 1.09388218, 1.03616461],
[ 0.9418178 , 1.07210878, 0.90431879],
[ 1.0093642 , 1.00408472, 1.07570172],
[ 0.92203074, 1.00022631, 1.09705542],
[ 0.99775598, 0.01000000, 0.94996408],
[ 1.02996389, 1.01224303, 1.00331465]])
Q
和W
的大小而增加。 - DathosPachy