包含多个高斯和多个样本的 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
。
我的问题是:我有 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
。