python - numpy中的加权协方差矩阵

标签 python arrays numpy covariance

我想计算 p 数量的 n 测量的协方差 C,其中每个单独的数量测量都有自己的权重。也就是说,我的权重数组 W 与我的数量数组 Q 具有相同的形状(n by p)。 native np.cov() 函数仅支持赋予单个测量值的权重(即,长度为 n 的向量)。

我可以用 p 矩阵初始化一个 p 并迭代,但是如果 p 很大,那么这是一个非常慢的过程。

由于已知 Q 的每个量(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]])

最佳答案

您可以将非常有效的矩阵乘法与 np.dot 结合使用-

QW = Q*W
C = QW.T.dot(QW)/W.T.dot(W)

关于python - numpy中的加权协方差矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38448579/

相关文章:

python - 无法在 macOS 上安装 PyGObject

python - Keras 在达到训练后保存最佳模型

c++ - Blas 看起来很慢

python - 在 Numpy 中生成对称矩阵

python - heroku django 未能检测到 set buildpack

python - 如何在Python中使用字典作为字典的键

javascript - 如何根据 Vanilla javascript中的属性对对象数组进行分组

javascript - 如何获得一致的数字排序结果?

python - 在嵌套 numpy 数组上应用掩码 - numpy - python

python - 使用 numpy 进行数组广播