我尝试实现 GMM,但在使用 em 算法时遇到了一些问题。
假设我有 3D 样本(stat1、stat2、stat3),我用它们来训练 GMM。
我的其中一个 GMM 的训练集几乎每个样本中 stat1 的值都是“0”。在训练期间,我在协方差矩阵的第一行和第一列中得到非常小的数字(例如“1.4456539880060609E-124”),这导致 EM 算法的下一次迭代在第一行和第一列中变为 0.0。
我得到这样的东西:
0.0 0.0 0.0
0.0 5.0 6.0
0.0 2.0 1.0
我需要逆协方差矩阵来计算密度,但由于一列为零,我无法执行此操作。
我考虑过回到旧的协方差矩阵(和平均值)或用一个非常小的数字替换每个 0。
或者这个问题还有其他简单的解决方案吗?
最佳答案
简单来说,您的数据位于实际输入空间的退化子空间中,而 GMM 不太适合这种设置的大多数通用形式。问题是您使用的经验协方差估计器对于此类数据根本失败(正如您所说 - 您无法反转它)。你通常做什么?您将协方差估计器改为约束/正则化协方差估计器,其中包含:
- 基于常数的收缩,因此不使用 Sigma = Cov(X),而是使用 Sigma = Cov(X) + eps * I,其中 eps 是预定义的小常数,I 是单位矩阵。因此,对角线上永远不会有零值,并且很容易证明,对于合理的 epsilon,这将是可逆的
- 非常合身的缩水,例如 Oracle Covariance Estimator或Ledoit-Wolf Covariance Estimator它根据数据本身找到最佳的 epsilon。
- 将高斯函数限制为球形高斯函数,例如 N(m, sigma I),其中 sigma = avg_i( cov( X[:, i] ) 是每个维度的平均协方差。这将您限制为球形高斯函数,并且也解决了上述问题
还有更多可能的解决方案,但都基于相同的东西 - chenge 协方差估计器,以这样的方式保证可逆性。
关于machine-learning - 在 em 算法期间处理协方差矩阵中的零行/列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35956794/