Numpy无循环基于全数据集计算X·Cov·X得到(1000,)结果的方法
Numpy 无循环计算逐样本二次型结果的方案
- 可以实现,你当前的写法存在逻辑问题:
X.T.dot(np.linalg.inv(covariance)).dot(X)得到的是7×7的全局矩阵乘积结果,没有实现逐样本计算二次型的需求,不符合输出维度要求。 - 正确实现方案有两种常用写法,均直接输出维度为(1000,)的结果:
- 方法1:使用
np.einsum(爱因斯坦求和)实现,逻辑最直观,代码如下:import numpy as np inv_cov = np.linalg.inv(covariance) # 写法1 res = np.einsum('ni,ij,nj->n', X, inv_cov, X) # 等价写法2 res = np.einsum('ij,ji->i', X @ inv_cov, X.T) - 方法2:使用矩阵乘法 + 逐元素乘加实现,计算效率更高:
inv_cov = np.linalg.inv(covariance) res = np.sum((X @ inv_cov) * X, axis=1)
- 方法1:使用
- 结果验证:你可以将上述结果和循环得到的结果做一致性校验,
np.allclose(循环得到的结果数组, res)会返回True,证明结果完全一致。
内容的提问来源于stack exchange,提问作者madml
相关产品推荐
相关产品推荐

