机器学习算法推导&实现13

您所在的位置:网站首页 高斯混合模型算法步骤 机器学习算法推导&实现13

机器学习算法推导&实现13

2024-07-17 05:12:29| 来源: 网络整理| 查看: 265

在之前的几篇文章中,我们重点讨论了贝叶斯相关的内容,从朴素贝叶斯到半朴素贝叶斯算法的实现和应用,我们将贝叶斯网留到概率图相关模型中再介绍。本文将要继续讨论概率相关的模型和算法——EM算法以及EM算法在高斯混合聚类(GMM)中的实现。

EM算法介绍

我们知道,如果概率模型的变量都是观测变量,那我们可以直接通过极大似然估计或者贝叶斯方法对训练集数据进行训练,以此来估计模型参数。但是当模型的变量并不只是观测变量,还包括隐变量时,我们就得用到EM算法。

实质上,EM算法就是含有隐变量的模型参数的极大似然估计法。

我们设观测到的变量数据为 X ,未观测到的隐变量数据为 Z ,模型参数为 \theta ,则观测到 X 的概率实际为:

完全数据的观测概率

由此,我们可以得到完全数据的对数似然函数:

完全数据的对数似然函数

另外在已知观测 X 和模型参数 \theta 的前提下,我们也可以推断出隐变量的概率分布为:

隐变量的概率分布

上述公式我们也可以理解为:观测 X 来自于隐变量 Z_k 的概率。

接着我们通过EM算法,就可以迭代去求解以上的对数似然函数。

1. E步:

以当前的模型参数为 \theta_i ,推断出隐变量 Z_k 的分布,并计算对数似然函数 LL(\theta) 关于 Z 的期望,生成 Q 函数,如下所示:

EM算法-Q函数

2. M步:

求解使得 Q 函数最大化的参数 \theta_i ,即:

EM算法-模型参数估计

获取新的参数 \theta_i 后,继续迭代,直至符合停止条件。

以上就是对EM算法的介绍,后面我们详细讲解下EM算法在高斯混合聚类模型(GMM)中的推导。

GMM介绍

首先我们来看下什么是高斯混合聚类模型(GMM),以及为什么可以用EM算法进行求解,最后再推导该怎么求解。

高斯混合聚类模型(GMM)是假设数据空间由K个混合成分组成,且每个混合成分对应着一个高斯分布,高斯分布的参数为μ和σ。

我们可以再假设下样本的产生过程,首先根据先验概率αi选择高斯分布,再根据高斯分布的概率密度函数进行采样。

高斯混合聚类模型的目标是确定观测值属于(来自于)哪一个高斯分布,也就是观测值对于高斯分布的概率分布。

由此我们发现EM算法非常贴合GMM。

EM的模型参数θ就是μ, σ;EM的隐变量Z就是高斯分布;EM的隐变量先验概率就是α(混合系数);EM的隐变量概率分布就是结果。GMM推导首先,我们另高斯混合聚类的概率分布函数如下:完全数据高斯观测概率

其中Φ就是高斯概率密度函数:

多元高斯分布函数

所以在GMM中,我们的目标函数就是最大化观测产生的对数似然函数:

高斯观测对应的对数似然函数其次,我们的参数估计可以使用EM算法:

1. E步:

生成Q函数如下:

GMM中的Q函数推导

这里的Eγ就是隐变量的概率分布,即第i个观测来自第k个高斯分布的概率,也是我们需要计算出来的:

GMM中的隐变量的概率分布函数

2. M步:

根据Q函数分别求出参数的迭代公式,均值和协方差矩阵分别令似然函数求导为0,即:

GMM中的参数估计方法

求解混合系数α的时候,需要利用和为1,通过拉格朗日函数将其转为无约束条件的函数,再对其进行求导:

GMM中的无约束的Q函数GMM中的混合系数参数估计方法然后,重复E,M步骤直至收敛停止迭代。

最后,找到样本i最大的Eγ,就是样本所在的第 k 个簇。

以上就是GMM的全部推导过程。

Python实现

我们通过EM算法来实现高斯混合聚类模型(GMM)。

首先,我们建立一个GMM类。初始化一些重要的参数,比如:聚类簇数、混合系数、均值向量、协方差矩阵等等。import numpy as np import matplotlib.pyplot as plt import os import copy os.chdir(r"D:\mywork\test") #高斯混合聚类模型类 class GaussianMix(object): #1、类的属性 def __init__(self): self.trainSet = 0 #数据集 self.ClusterLabel = 0 #聚类标签 self.k = 0 #聚类个数 self.LL_ValueList = [] #最大似然函数的值列表 self.AlphaArr = 0 #高斯混合模型混合系数 self.MiuArr = 0 #高斯分布函数的均值参数 self.SigmaArr = 0 #高斯分布函数的协方差参数 self.m = 0 #样本数 self.d = 0 #样本维度 #2、初始化函数参数 def initParas(self, x, k): self.trainSet = x self.k = k self.m, self.d = np.shape(x) AlphaArr0 = np.ones((1,k))/k MiuArr0 = x[np.random.randint(0, self.m, k)] #在这里固定好了 #MiuArr0 = x[[5,6,12]] SigmaArr0 = np.array([(np.eye(self.d)*0.1).tolist()]*k) return AlphaArr0, MiuArr0, SigmaArr0其次,我们写一个多元高斯分布的密度函数。 def Gaussian_multi(self, x, miu, sigma): distributionArr = np.exp(-0.5*np.sum(np.multiply(np.dot(x-miu, np.linalg.pinv(sigma)), x-miu), axis=1))/\ (np.power(2*np.pi, 0.5*self.d)*np.linalg.det(sigma)**0.5) return distributionArr接着,我们写EM中用到的函数。隐变量概率分布函数、更新参数函数、求解对数似然函数值函数。 def Gama_Prob(self, x, AlphaArr, MiuArr, SigmaArr): GaussProbArr = np.zeros((self.m, self.k)) for i in range(self.k): miu = MiuArr[i] sigma = SigmaArr[i] GaussProbArr[:,i] = self.Gaussian_multi(x, miu, sigma) GamaProbArr = np.copy(np.multiply(GaussProbArr, AlphaArr)) SumGamaProb = np.sum(GamaProbArr, axis=1).reshape(-1,1) return (GamaProbArr/SumGamaProb).round(4), GamaProbArr.round(4) def updateParas(self, x, GamaProbArr): SumGamaProb = np.sum(GamaProbArr, axis=0) newMiuArr = np.zeros((self.k,self.d)) newSigmaArr = np.zeros((self.k,self.d,self.d)) for i in range(self.k): Gama = GamaProbArr[:,i].reshape(-1,1) #更新均值 newMiu = np.sum(np.multiply(Gama, x), axis=0)/SumGamaProb[i] newMiuArr[i] = newMiu #更新协方差矩阵 newSigma = np.dot(np.multiply(x-newMiu, Gama).T, x-newMiu)/SumGamaProb[i] newSigmaArr[i] = newSigma newAlphaArr = SumGamaProb.reshape(1,-1)/self.m return newMiuArr, newSigmaArr, newAlphaArr def calLLvalue(self, GaussProbArr): LLvalue = sum(np.log(GaussProbArr.sum(axis=1)+1.0e-6)) return LLvalue 最后,按照EM算法步骤写下训练函数。同时保存参数、最终的簇标签、似然值变化等等。我们还写了供二维数据使用的等高图画图函数。 def train(self, x, k, iters): #初始化参数 AlphaArr0, MiuArr0, SigmaArr0 = self.initParas(x, k) LLvalue0 = 0 #初始似然函数值 LLvalueList = [] #最大似然值列表 for i in range(iters): #计算高斯分布模型的后验概率,也就是已知观测下来自于第k个高斯分布函数的概率 GamaProbArr, GaussProbArr = self.Gama_Prob(x, AlphaArr0, MiuArr0, SigmaArr0) #计算聚类结果 ClusterLabel = np.argmax(GamaProbArr, axis=1) #画分布图(适用于二维) if self.d == 2: if (i%5 == 0) | (i==iters-1): print("第%d轮迭代"%i) self.drawPics(x, MiuArr0, SigmaArr0, ClusterLabel) #计算似然函数,并判断是否继续更新 LLvalue1 = self.calLLvalue(GaussProbArr) print('似然值:',LLvalue1) if len(LLvalueList) == 0: LLvalue0 = LLvalue1 else: LLdelta = LLvalue1 - LLvalue0 print('似然值提升:',LLdelta) if abs(LLdelta)


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭