EM算法在GMM上的两个简单应用
此文包括EM算法在GMM上的两个实例代码实现。
其中第一个是在两个一元高斯分布的参数估计。
第二个事在三个二元独立高斯分布下的聚类。当然不独立的情况也类似,这里就不再举例了。。
先放上代码,后续会更新细节介绍
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import copy
from scipy.stats import multivariate_normal
E step
# def gaussian(x, mu, sigma):
# n = np.shape(x)[1]
# expOn = float(-0.5 * (x - mu) * (sigma.I) * ((x - mu).T))
# divBy = pow(2 * np.pi, n / 2) * pow(np.linalg.det(sigma), 0.5) # np.linalg.det 计算矩阵的行列式
# return pow(np.e, expOn) / divBy
def gaussian(x, mu, sigma):
norm = multivariate_normal(mean=mu.tolist()[0], cov=sigma)
return norm.pdf(x)
def eStep(observed_rg, alpha, mu, sigma):
gamma = np.mat(np.zeros([N, K]))
for i in range(N):
gammaSum = [0] * K
for j in range(K):
gammaSum[j] = alpha[j] * gaussian(observed_rg[i, :], mu[j], sigma[j])
for k in range(K):
gamma[i, k] = gammaSum[k]/sum(gammaSum)
return gamma
M step
def mStep(gamma, observed_rg, alpha, mu, sigma):
for j in range(K):
sum_gamma = sum(gamma[:, j])
alpha[j] = sum_gamma / N
mu[j] = sum([np.multiply(gamma[t, j], observed_rg[t, :]) for t in range(N)]) / sum_gamma
sigma[j] = sum([np.multiply(gamma[t, j], np.dot((observed_rg[t, :]