包含多个高斯和多个样本的 pdf 的 numpy 矩阵的矢量化

Vectorization of numpy matrix that contains pdf of multiple gaussians and multiple samples

我的问题是:我有 K 个多变量高斯分布的 GMM 模型,还有 N 个样本。 我想创建一个 N*K numpy 矩阵,在它的 [i,k] 单元格中有第 i 个样本上第 k 个高斯的 pdf 函数,即在这个单元格中有 简而言之,我对以下矩阵感兴趣: pdf matrix

这是我现在拥有的(我正在使用 python):

Q = np.array([scipy.stats.multivariate_normal(mu_t[k], cov_t[k]).pdf(X) for k in range(self.K)]).T

代码中的X是一个矩阵,其行是我的样本。

它在小尺寸的小玩具数据集上运行良好,但我正在处理的数据集是 10,000 张 28*28 图片,并且这条线 运行 非常慢...

我想找到一个不涉及循环但只涉及 vector\matrix 操作(即矢量化)的解决方案。据我了解,scipy 'multivariate_normal' 函数的参数不能超过 1 个高斯(但它的 'pdf' 函数可以一次计算多个样本)。

有人有想法吗?

恐怕您问题中的主要速度杀手是 cov_t 矩阵的求逆和行列式计算。如果您以某种方式设法预先计算了这些,则可以注册计算并使用 np.add.outer 获取 x_i - mu_k 的所有组合,然后使用数组理解来计算具有正态分布函数的完整公式的概率。

尝试

S = np.add.outer(X,-mu_t)
cov_t_inv = ??
cov_t_inv_det = ??
Q = 1/(2*np.pi*cov_t_inv_det)**0.5 * np.exp(-0.5*np.einsum('ikr,krs,kis->ik',S,cov_t_inv,S))

在其中为逆协方差矩阵插入预先计算的数组 cov_t_inv,为其行列式插入 cov_t_inv_det