老问题哈哈。但我今天也有同样的。也许其他人也会。
我想我设法在我的实施中解决了这个问题。我首先检查在 M 步骤之后计算的方差是否会导致下溢,然后将这些方差重新分配给不会导致下溢的最小可能方差。例如,我发现对于 python 的 scipy.stats multivariate_normal.pdf 实现,任何超过平均值约 37.77 标准偏差的数据都会导致下溢。因此,在 M 步骤之后,我正在按照以下方式做一些事情:
observation_min, observation_max = (max(observations), min(observations))
aprx_max_std_dev = 37.7733
N = Number of latent states
M = Count of gaussians in mixture model
mu = means (shape: NxM)
U = variances (shape: NXM)
for n in range(N):
for m in range(M):
dist_to_min = mu[n,m] - observation_min
dist_to_max = observation_max - mu[n,m]
max_dist_from_mean = max(dist_to_min,dist_to_max)
smallest_good_variance = square(max_dist_from_mean / aprx_max_std_dev)
if smallest_good_variances > U[n,m]
U[n,m] = smallest_good_variance
另外,我遇到了比例系数有时太小的问题。因此,接下来,如果比例系数变得小于某个小值(我使用的是 <0.001),从逻辑上讲,正态分布似乎并不重要或对整个混合模型贡献很大。所以我基本上重新分配系数尺度,使它们都有合理的值加起来为 1。因此,例如,如果我有一个 M=3 并且我的系数是 (0.7998, 0.2, 0.0008),我会从最大的一个中窃取一些比例并重新分配到 (0.4, 0.2, 0.4)。
最后,要尝试防止它在 EM 的进一步迭代后回到相同的位置。我在observation_min 和observation_max 之间随机选择一个新的均值,作为具有非常小的尺度的均值。