EM 算法在高斯混合模型下的分类应用(初探)

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, :]-mu[j
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值