之前写过一篇博客讲述极大似然方法, 这一方法通常适用于知道观测数据 Y Y Y,求解模型参数 θ \theta θ的场合,即 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ)。
但是,在更多场合除了模型参数是未知的外,还有隐变量 Z Z Z也是未知的,即 P ( Y , Z ∣ θ ) P(Y,Z|\theta) P(Y,Z∣θ)。多个隐藏模型的混合,会使得普通的极大似然方法用起来不是那么方便,比如求解高斯混合模型(GMM), 隐马尔可夫模型(HMM),等。这种时候,就会发觉EM算法是机器学习领域中绕不过去的一道坎。

这里,主要基于《统计学习方法》里对于高斯混合模型的讲解,实现EM算法,并给出代码和注释。
在实现模型之前,观察过其他人写的代码,包括sklearn内部的代码,相比较而言,这次的实现封装的更好,使用会更方便,结果也不错。

先描述一下实现的原理,再说代码

目录

  • 一、EM算法解高斯混合模型
    • 1.0 EM算法:初始化模型参数
    • 1.1 EM算法的E步:确定Q函数
    • 1.2EM算法的M步:更新模型参数
  • 二、EM算法求解高斯混合模型
  • 三、资源下载

一、EM算法解高斯混合模型

假设观测数据 y 1 , y 2 , . . . , y N y_{1},y_{2},...,y_{N} y1​,y2​,...,yN​由3高斯混合模型生成,即
P ( y ∣ θ ) = ∑ k = 1 K a k ϕ ( y ∣ θ k ) P(y|\theta)=\sum_{k=1}^{K}a_{k}\phi(y|\theta_{k}) P(y∣θ)=k=1∑K​ak​ϕ(y∣θk​)
其中 θ = ( a 1 , a 2 , . . . , a k ; θ 1 , θ 2 , . . . , θ k ) \theta=(a_{1},a_{2},...,a_{k};\theta_{1},\theta_{2},...,\theta_{k}) θ=(a1​,a2​,...,ak​;θ1​,θ2​,...,θk​), 我们用EM算法估计高斯混合模型的参数 θ \theta θ

1.0 EM算法:初始化模型参数

1.1 EM算法的E步:确定Q函数

混合高斯模型的Q函数为:
Q ( θ , θ i ) = ∑ k = 1 K { ∑ j = 1 N ( E γ j k ) l o g a k + ∑ j = 1 N ( E γ j k ) [ l o g ( 1 / 2 π ) − l o g ( σ k ) − ( 1 / 2 σ k 2 ) ( y j − u k ) 2 ] Q(\theta,\theta^{i})=\sum_{k=1}^{K}\{\sum_{j=1}^{N}(E_{\gamma_{jk}})loga_{k}+\sum_{j=1}^{N}(E_{\gamma_{jk}})[log(1/\sqrt{2\pi})-log(\sigma_{k})-(1/2\sigma_{k}^{2})(y_{j}-u_{k})^{2}] Q(θ,θi)=k=1∑K​{j=1∑N​(Eγjk​​)logak​+j=1∑N​(Eγjk​​)[log(1/2π ​)−log(σk​)−(1/2σk2​)(yj​−uk​)2]
这里需要计算 E ( γ j k ∣ y , θ ) E(\gamma_{jk}|y,\theta) E(γjk​∣y,θ),记为 γ ^ j k \hat{\gamma}_{jk} γ^​jk​
γ ^ j k = a k ϕ ( y j ∣ θ k ) ∑ k = 1 K a k ϕ ( y j ∣ θ k ) , j = 1 , 2 , . . . , N ; k = 1 , 2 , . . . , K \hat{\gamma}_{jk}=\frac{a_{k}\phi(y_{j}|\theta_{k})}{\sum_{k=1}^{K}a_{k}\phi(y_{j}|\theta_{k})},j=1,2,...,N;k=1,2,...,K γ^​jk​=∑k=1K​ak​ϕ(yj​∣θk​)ak​ϕ(yj​∣θk​)​,j=1,2,...,N;k=1,2,...,K γ ^ j k \hat{\gamma}_{jk} γ^​jk​是当前模型参数下第 j j j个观测数据来自第 k k k个分模型的概率,称为分模型 k k k对观测数据 y j y_{j} yj​的影响度

1.2EM算法的M步:更新模型参数

M步极大化Q函数,更新模型参数如下:
u ^ k = ∑ j = 1 N γ ^ j k y j ∑ j = 1 N γ ^ j k , k = 1 , 2... , K \hat{u}_{k}=\frac{\sum_{j=1}^{N}\hat{\gamma}_{jk}y_{j}}{\sum_{j=1}^{N}\hat{\gamma}_{jk}},k=1,2...,K u^k​=∑j=1N​γ^​jk​∑j=1N​γ^​jk​yj​​,k=1,2...,K σ ^ k 2 = ∑ j = 1 N γ ^ j k ( y j − u k ) 2 ∑ j = 1 N γ ^ j k , k = 1 , 2... , K \hat{\sigma}_{k}^{2}=\frac{\sum_{j=1}^{N}\hat{\gamma}_{jk}(y_{j}-u_{k})^{2}}{\sum_{j=1}^{N}\hat{\gamma}_{jk}},k=1,2...,K σ^k2​=∑j=1N​γ^​jk​∑j=1N​γ^​jk​(yj​−uk​)2​,k=1,2...,K a ^ k = ∑ j = 1 N γ ^ j k N , k = 1 , 2... , K \hat{a}_{k}=\frac{\sum_{j=1}^{N}\hat{\gamma}_{jk}}{N},k=1,2...,K a^k​=N∑j=1N​γ^​jk​​,k=1,2...,K
重复E步和M步直到模型收敛

二、EM算法求解高斯混合模型

from sklearn.datasets import load_digits, load_iris
from scipy.stats import multivariate_normal
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
import numpy as npclass GMM_EM():def __init__(self,n_components,max_iter = 1000,error = 1e-6):self.n_components = n_components  #混合模型由几个gauss模型组成self.max_iter = max_iter  #最大迭代次数self.error = error  #收敛误差self.samples = 0self.features = 0self.alpha = []   #存储模型权重self.mu = []   #存储均值self.sigma = []   #存储标准差def _init(self,data):   #初始化参数np.random.seed(7)self.mu = np.array(np.random.rand(self.n_components, self.features))self.sigma = np.array([np.eye(self.features)/self.features] * self.n_components)self.alpha = np.array([1.0 / self.n_components] * self.n_components)print(self.alpha.shape,self.mu.shape,self.sigma.shape)def gauss(self, Y, mu, sigma):  #根据模型参数和数据输出概率向量return multivariate_normal(mean=mu,cov=sigma+1e-7*np.eye(self.features)).pdf(Y)def preprocess(self,data):   # 数据预处理self.samples = data.shape[0]self.features = data.shape[1]pre = preprocessing.MinMaxScaler()return pre.fit_transform(data)def fit_predict(self,data):   #拟合数据data = self.preprocess(data)self._init(data)weighted_probs = np.zeros((self.samples,self.n_components))for i in range(self.max_iter):prev_weighted_probs = weighted_probsweighted_probs = self._e_step(data)change = np.linalg.norm(weighted_probs - prev_weighted_probs) if change < self.error:breakself._m_step(data,weighted_probs)return weighted_probs.argmax(axis = 1)def _e_step(self,data):   # E步probs = np.zeros((self.samples,self.n_components))for i in range(self.n_components):probs[:,i] = self.gauss(data, self.mu[i,:], self.sigma[i,:,:])weighted_probs = np.zeros(probs.shape)for i in range(self.n_components):weighted_probs[:,i] = self.alpha[i]*probs[:,i]for i in range(self.samples):weighted_probs[i,:] /= np.sum(weighted_probs[i,:])return weighted_probsdef _m_step(self,data,weighted_probs):  #M步for i in range(self.n_components):sum_probs_i = np.sum(weighted_probs[:,i])self.mu[i,:] = np.sum(np.multiply(data, np.mat(weighted_probs[:, i]).T), axis=0) / sum_probs_iself.sigma[i,:,:] = (data - self.mu[i,:]).T * np.multiply((data - self.mu[i,:]), np.mat(weighted_probs[:, i]).T) / sum_probs_iself.alpha[i] = sum_probs_i/data.shape[0]def predict_prob(self,data):  #预测概率矩阵return self._e_step(data)def predict(self,data):  #输出类别return self._e_step(data).argmax(axis = 1)dataset = load_iris()
data = dataset['data']
label = dataset['target']gmm = GMM_EM(3)
pre_label = gmm.fit_predict(data)
print(accuracy_score(pre_label,label))
# EM算法是对初始值敏感的,修改初始化的值会发现模型性能变化很大

三、资源下载

微信搜索“老和山算法指南”获取更多资源下载链接与技术交流群

有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。

机器学习教程 之 EM算法 :高斯混合模型聚类算法 (python基于《统计学习方法》实现,附数据集和代码)相关推荐

  1. 高斯混合模型聚类算法和K-Means聚类算法

    高斯混合模型聚类算法 概念:混合高斯模型就是指对样本的概率密度分布进行估计,而估计的模型是几个高斯模型加权之和(具体是几个要在模型训练前建立好).每个高斯模型就代表了一个类(一个Cluster).对样 ...

  2. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现

    1. 前言 EM的前3篇博文分别从数学基础.EM通用算法原理.EM的高斯混合模型的角度介绍了EM算法.按照惯例,本文要对EM算法进行更进一步的探究.就是动手去实践她. 2. GMM实现 我的实现逻辑基 ...

  3. 高斯混合模型聚类实战(Gaussian Mixtures)

    高斯混合模型聚类实战(Gaussian Mixtures) 目录 高斯混合模型聚类实战(Gaussian Mixtures) 高斯混合模型构建

  4. 【Opencv】目标追踪——高斯混合模型分离算法(MOG)

    文章目录 1 环境 2 效果 3 原理 4 代码 1 环境 Python 3.8.8 PyCharm 2021 opencv-python 2 效果 3 原理   视频图像中的目标检测与跟踪,是计算机 ...

  5. 机器学习实战(九)K-均值聚类算法

    文章目录 前言: 一.K-均值聚类算法 二.算法分析 三.二分k均值聚类 前言: 机器学习中有两类的大问题,一个是分类,一个是聚类. 分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够 ...

  6. 高斯混合模型聚类(GMM)matlab实现

    Gaussian Mixture Model ,就是假设数据服从 Mixture Gaussian Distribution ,换句话说,数据可以看作是从数个 Gaussian Distributio ...

  7. 【机器学习】一文读懂层次聚类(Python代码)

    本篇和大家介绍下层次聚类,先通过一个简单的例子介绍它的基本理论,然后再用一个实战案例Python代码实现聚类效果. 首先要说,聚类属于机器学习的无监督学习,而且也分很多种方法,比如大家熟知的有K-me ...

  8. ML之Clustering之普聚类算法:普聚类算法的相关论文、主要思路、关键步骤、代码实现等相关配图之详细攻略

    ML之Clustering之普聚类算法:普聚类算法的相关论文.主要思路.关键步骤.代码实现等相关配图之详细攻略 目录 普聚类算法的相关论文 普聚类算法的主要思路 普聚类算法的关键步骤 普聚类算法的代码 ...

  9. k中心点聚类算法伪代码_聚类算法之——K-Means、Canopy、Mini Batch K-Means

    K-Means||算法 K-Means||算法是为了解决K-Means++算法缺点而产生的一种算法: 主要思路是改变每次遍历时候的取样规则,并非按照K-Means++算法每次遍历只获取一个样本,而是每 ...

最新文章

  1. 网络推广营销浅析网站在优化中流量突然减少了是为什么?
  2. matlab 读取WAV文件
  3. Mac 解压Android NDK.bin文件
  4. Boost:双图bimap与range范围的测试程序
  5. 搭建kafaka_Kafka 环境部署搭建
  6. 《MySQL必知必会》[01] 基本查询
  7. 朱建辉php,朱建辉/laravel-bjyblog
  8. 外部服务发现之 ingress(一) traefik 的安装使用
  9. Android架构:认识简法设计与EIT软件造形(序)
  10. java从服务器下载xls文件到客户端
  11. 坯子库曲面推拉教程_psd素材丨嘤,今天是仙仙的水墨风建筑表达教程(文末附讲解视频+效果图+贴图素材合集)...
  12. Android保存音频文件
  13. 【PCBA方案】咖啡电子秤芯片方案介绍
  14. android根据轮播图片颜色改变背景颜色
  15. Visual Studio x64 编译 .asm 文件方法
  16. [STM8L15x]输入捕获获取PWM占空比
  17. 导向滤波与opencv python实现
  18. 成功解决Cannot uninstall 'pywin32'. It is a distutils installed project and thus we cannot accurately de
  19. 安卓手机误删文件恢复
  20. 按键精灵 获取网页flash游戏 句柄 以360浏览器为例

热门文章

  1. 如何用matlab进行部分式展开_[转载]用MATLAB进行部分分式展开
  2. 阿里巴巴校园招聘2019面试总结
  3. 数字中国下的居住服务数字化
  4. linux下查看网卡限速,linux 网卡限速
  5. Hibernate中实体对象的瞬时态,持久态,游离态之间的转换
  6. 【Android-Java】随机数产生,使用SecureRandom替代Random
  7. 从上到下、从左到右的顺序编号
  8. DS-SLAM的运行[TUM-1] process has died [pid 27902, exit code -11, cmd /home/jerry/catkin_ws/src/DS-SLAM/
  9. 『津津乐道播客』#132. 《流浪地球》带火了中国科幻?
  10. inno setup vs NSIS