目录
一、算法介绍
1.1算法背景
1.2算法引入
1.3算法假设
1.4算法原理
1.5算法步骤
二、算法公式推导
2.1数学基础
2.2EM算法推导
三、算法实现
3.1关于EM聚类
3.2EM工具包的使用
3.3 实例测试
四、算法讨论
4.1EM算法的优缺点
4.2EM算法的应用
4.3对于EM算法框架,如何选择具体的算法
五、实验总结
一、算法介绍
1.1算法背景
EM 的英文是 Expectation Maximization,所以 EM 算法也叫最大期望算法。
EM算法最早由Arthur Dempster、Nan Laird和Donald Rubin在1977年提出,用于解决包含隐变量的统计模型参数估计问题。
在许多现实问题中,观测数据并不完整,存在一些未观测到的隐含信息或隐变量,这时候就需要使用EM算法来对模型进行参数估计。
EM算法通过迭代的方式,交替进行“期望步骤”和“最大化步骤”,不断优化参数估计值,直到收敛为止。
1.2算法引入
由一个简单的场景进行EM算法的引入:
假设你炒了一份菜,想要把它平均分到两个碟子里,该怎么分?
很少有人用称对菜进行称重,再计算一半的分量进行平分。大部分人的方法是先分一部分到碟子 A 中,然后再把剩余的分到碟子 B 中,再来观察碟子 A 和 B 里的菜是否一样多,哪个多就匀一些到少的那个碟子里,然后再观察碟子 A 和 B 里的是否一样多……整个过程一直重复下去,直到份量不发生变化为止。
你能从这个例子中看到三个主要的步骤:初始化参数、观察预期、重新估计。首先是先给每个碟子初始化一些菜量,然后再观察预期,这两个步骤实际上就是期望步骤(Expectation)。如果结果存在偏差就需要重新估计参数,这个就是最大化步骤(Maximization)。这两个步骤加起来也就是 EM 算法的过程。
1.3算法假设
EM算法的算法假设包括以下几点:
(1)隐变量假设:
EM算法针对含有隐变量的概率模型,假设存在一些未观测到的隐变量,这些隐变量与观测变量共同决定了观测数据的生成过程。
(2)参数假设:
假设模型中包含一些需要估计的参数,这些参数可以完全描述观测数据的生成过程。
这些参数可能是概率分布的参数、混合模型的权重参数等,需要通过EM算法进行估计。
(3)独立同分布(i.i.d.)假设:
EM算法通常假设观测数据是独立同分布的,即每个观测样本都是相互独立且具有相同的概率分布。
(4)完全数据假设:
EM算法引入“完全数据”概念,即假设观测数据不仅包括观测变量,还包括相应的隐变量,从而将估计问题转化为对完全数据的估计问题。
通过引入完全数据,可以简化模型的描述和参数估计。
总之,EM算法的基本假设包括含有隐变量的概率模型、需要估计的模型参数、观测数据的独立同分布性质以及完全数据的引入。在这些假设下,EM算法能够有效地进行参数估计,并在实际应用中取得了广泛的成功。
1.4算法原理
EM算法是一种用于含有隐变量的概率模型参数估计的迭代优化算法,其核心原理可以简要概括如下:
(1)E步骤(Expectation Step):
在E步骤中,根据当前的模型参数估计值,计算隐变量的后验概率。这一步骤的目的是计算在给定观测数据情况下,每个隐变量取不同取值的概率。
通过对隐变量的后验概率进行计算,可以得到对未观测到的隐变量的更准确的估计。
(2)M步骤(Maximization Step):
在M步骤中,利用在E步骤中计算得到的隐变量的后验概率,最大化完全数据的对数似然函数来更新模型参数。换言之,就是用E步骤得到的隐变量的后验概率加权的方式来更新模型参数。
(3)迭代更新:
在完成E步骤和M步骤后,得到新的模型参数估计值,然后将这些新的参数估计值用于下一轮的E步骤和M步骤。
通过不断地进行E步骤和M步骤的交替迭代,直至参数收敛或达到预定的迭代次数,从而获得最终的模型参数估计值。
(4)收敛性:
EM算法保证在每次迭代步骤后,对数似然函数都会增加或保持不变,因此EM算法可以收敛到局部最优解。
但需要注意的是,EM算法并不能保证收敛到全局最优解,因其结果受初始参数值的影响。
总之,EM算法通过交替进行E步骤和M步骤,能够有效地估计含有隐变量的概率模型的参数。
1.5算法步骤
步骤一: 参数的初值可以任意选择,但需注意EM算法对初值是敏感的
步骤二: E步求Q(θ,θ(i))。Q函数式中Z是未观测数据,Y是观测数据。注意,Q(θ,θ(i))的第1个变元表示要极大化的参数,第2个变元表示参数的当前估计值。
步骤三: M步求Q(θ,θ(i))的极大化,得到θ(i+1)。
步骤四: 给出停止迭代的条件,一般是对较小的正数ε1,ε2,若满足下面条件则停止迭代。
EM算法计算流程
二、算法公式推导
2.1数学基础
(1)数学期望
数学期望就是一个事件可能获得的所有结果被其获得相应结果的可能性(概率)“降价(加权)”后,求得的和,作为该事件的整体期望结果,也就是用一个数来表示一件事获得可能结果是啥。
假设一个随机事件X ,对于离散型数值的数学期望为:
pi为xi发生的概率值。
对于连续型数值的数学期望为:
f(x)为x的概率密度函数。
(2)最大似然估计
最大似然估计分为离散型随机变量和连续型随机变量两种。离散型随机变量是一系列独立同分布的随机事件在某个或某些未知参数θ的参与下,其得到最大概率值下,对参数θ的估计;连续型随机变量是指一系列具有连续特征的随机变量在某个或某些未知参数θ的参与下,其得到最大概率密度值下,对参数θ的估计。
通常,由于计算最大概率值时,需要用到概率连乘,这将在计算上带来很大的麻烦,因此,我们在求解最大似然值时,往往采用对数方法进行,即对连乘式取ln或者log,将连乘转换成连加形式,再求其偏导。
总结求解极大似然估计问题步骤:
写出似然函数;
对似然函数取对数,并整理;
求导数,令导数为0,得到似然方程;
解似然方程,得到的参数即为所求;
(3)JenSen不等式
如果f是凸函数,X是随机变量,那么:E[f(X)]>=f(E[X]),通俗的说法是函数的期望大于等于期望的函数。
特别地,如果f是严格凸函数,当且仅当P(X = EX) = 1,即X是常量时,上式取等号,即E[f(X)] = f(EX)
2.2EM算法推导
(1)对于每个实例,用表示样本实例隐含变量z的某种分布,且满足条件()=1, () >=0,∀j,如果是连续性的,则表示概率密度函数,需要将求和符号换成积分符号。
对于上面的式子,做如下变换:
上面三个式子中,式(1)是根据联合概率密度下某个变量的边缘密度函数求解的(这里把 z 当作是随机变量)。对每一个样本i的所有可能类别 z 求等式右边的联合概率密度函数和,也就得到等式左边为随机变量 x 的边缘概率密度。由于对式(1)直接求导非常困难,所以将其分子分母都乘以一个相等的函数,转换为式(2)。而在式(2)变为式(3)的过程,采用的是上面提到的Jensen不等式。
因此便得到了公式(3)。OK,现在我们知道上面的式(2)和式(3)两个不等式可以写成:似然函数 L ( > = J ( z , Q )的形式( z 为隐含变量),那么我们可以通过不断的最大化 J 的下界,来使得L(θ)不断提高,最终达到它的最大值。
(2)完整的流程如下
第一步,初始化分布参数 θ;
第二步,重复E-step 和 M-step直到收敛:
·E步骤:根据参数的初始值或上一次迭代的模型参数来计算出的隐性变量的后验概率(条件概率),其实就是隐性变量的期望值。作为隐藏变量的现有估计值:
·M步骤:最大化似然函数从而获得新的参数值:
通过不断的迭代,然后就可以得到使似然函数 L(θ)最大化的参数 θ了。
(3)讨论如何确保EM收敛
假定和是EM第t次和t+1次迭代后的结果。如果我们证明了
l<=l(),也就是说极大似然估计单调增加,那么最终我们就会得到极大似然估计的最大值。下面来证明,选定 θ(t)之后,我们得到E步:
这一步保证了在给定θ(t)时,Jensen不等式中的等式成立,也就是
然后进行M步,固定,并将试作变量,对上面的式子求导,得到,这样经过一些推导会有以下式子成立:
在公式(4)中,得到,只是最大化l,也就是l的下界,并没有使等式成立,等式成立只有在固定,并按E步得到时才能成立。
这样就证明了 l(θ)会单调增加。如果要判断收敛情况,可以这样来做:一种收敛方法是 l(θ)不再变化,还有一种就是变化幅度很小,即根据的值来决定。
总之,EM算法类似于坐标上升法(coordinate ascent):E步:固定 θ,优化Q;M步:固定Q,优化 θ;交替将极值推向最大。
三、算法实现
3.1关于EM聚类
经过上述分析及推导,可以看到 EM 算法最直接的应用就是求参数估计。如果我们把潜在类别当做隐藏变量,样本看做观察值,就可以把聚类问题转化为参数估计问题。这也就是 EM 聚类的原理。
相比于 K-Means 算法,EM 聚类更加灵活,比如下面这两种情况,K-Means 会得到下面的聚类结果。
因为 K-Means 是通过距离来区分样本之间的差别的,且每个样本在计算的时候只能属于一个分类,称之为是硬聚类算法。而 EM 聚类在求解的过程中,实际上每个样本都有一定的概率和每个聚类相关,叫做软聚类算法。
可以把 EM 算法理解成为是一个框架,在这个框架中可以采用不同的模型来用 EM 进行求解。
常用的 EM 聚类有 GMM 高斯混合模型和 HMM 隐马尔科夫模型。GMM(高斯混合模型)聚类就是 EM 聚类的一种。比如上面这两个图,可以采用 GMM 来进行聚类。
和 K-Means 一样,我们事先知道聚类的个数,但是不知道每个样本分别属于哪一类。通常,我们可以假设样本是符合高斯分布的(也就是正态分布)。每个高斯分布都属于这个模型的组成部分(component),要分成 K 类就相当于是 K 个组成部分。这样我们可以先初始化每个组成部分的高斯分布的参数,然后再看来每个样本是属于哪个组成部分。这也就是 E 步骤。
再通过得到的这些隐含变量结果,反过来求每个组成部分高斯分布的参数,即 M 步骤。反复 EM 步骤,直到每个组成部分的高斯分布参数不变为止。
这样也就相当于将样本按照 GMM 模型进行了 EM 聚类。
3.2EM工具包的使用
在 Python 中有第三方的 EM 算法工具包。此次我采用的是 GMM 高斯混合模型,在使用前需要引入工具包:
from sklearn.mixture import GaussianMixture
创建完 GMM 聚类器之后,我们就可以传入数据让它进行迭代拟合。
我们使用 fit 函数,传入样本特征矩阵,模型会自动生成聚类器,然后使用 prediction=gmm.predict(data) 来对数据进行聚类,传入想进行聚类的数据,可以得到聚类结果 prediction。
3.3 实例测试
尝试使用 EM 算法对王者荣耀数据进行聚类
在了解了 GMM 聚类工具之后,我们尝试对王者荣耀的英雄数据进行聚类。
我们可以通过聚类算法把特征值相近的数据归为一类,不同类之间的差异较大,这样就可以对原始数据进行降维。通过分成几个组(簇),来研究每个组之间的特性。或者我们也可以把组(簇)的数量适当提升,这样就可以找到可以互相替换的英雄,比如你的对手选择了你擅长的英雄之后,你可以选择另一个英雄作为备选。
(1)数据集描述
这里我们收集了 69 名英雄的 20 个特征属性,这些属性分别是最大生命、生命成长、初始生命、最大法力、法力成长、初始法力、最高物攻、物攻成长、初始物攻、最大物防、物防成长、初始物防、最大每 5 秒回血、每 5 秒回血成长、初始每 5 秒回血、最大每 5 秒回蓝、每 5 秒回蓝成长、初始每 5 秒回蓝、最大攻速和攻击范围等。
数据集部分数据如下:
(2)代码实现
现在我们需要对王者荣耀的英雄数据进行聚类,我们先设定项目的执行流程:
首先我们需要加载数据源;
在准备阶段,我们需要对数据进行探索,包括采用数据可视化技术,让我们对英雄属性以及这些属性之间的关系理解更加深刻,然后对数据质量进行评估,是否进行数据清洗,最后进行特征选择方便后续的聚类算法;
聚类阶段:选择适合的聚类模型,这里我们采用 GMM 高斯混合模型进行聚类,并输出聚类结果,对结果进行分析。
代码如下:
- # -*- coding: utf-8 -*-
- import pandas as pd
- import csv
- import matplotlib.pyplot as plt
- import seaborn as sns
- from sklearn.mixture import GaussianMixture
- from sklearn.preprocessing import StandardScaler
- # 数据加载,避免中文乱码问题
- data_ori = pd.read_csv('heroes.csv', encoding = 'gb18030')
- features = [u'最大生命',u'生命成长',u'初始生命',u'最大法力', u'法力成长',u'初始法力',u'最高物攻',u'物攻成长',u'初始物攻',u'最大物防',u'物防成长',u'初始物防', u'最大每 5 秒回血', u'每 5 秒回血成长', u'初始每 5 秒回血', u'最大每 5 秒回蓝', u'每 5 秒回蓝成长', u'初始每 5 秒回蓝', u'最大攻速', u'攻击范围']
- data = data_ori[features]
- # 对英雄属性之间的关系进行可视化分析
- # 设置 plt 正确显示中文
- plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
- plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
- # 用热力图呈现 features_mean 字段之间的相关性
- corr = data[features].corr()
- plt.figure(figsize=(14,14))
- # annot=True 显示每个方格的数据
- sns.heatmap(corr, annot=True)
- plt.show()
- # 相关性大的属性保留一个,因此可以对属性进行降维
- features_remain = [u'最大生命', u'初始生命', u'最大法力', u'最高物攻', u'初始物攻', u'最大物防', u'初始物防', u'最大每 5 秒回血', u'最大每 5 秒回蓝', u'初始每 5 秒回蓝', u'最大攻速', u'攻击范围']
- data = data_ori[features_remain]
- data[u'最大攻速'] = data[u'最大攻速'].apply(lambda x: float(x.strip('%'))/100)
- data[u'攻击范围']=data[u'攻击范围'].map({'远程':1,'近战':0})
- # 采用 Z-Score 规范化数据,保证每个特征维度的数据均值为 0,方差为 1
- ss = StandardScaler()
- data = ss.fit_transform(data)
- # 构造 GMM 聚类
- gmm = GaussianMixture(n_components=30, covariance_type='full')
- gmm.fit(data)
- # 训练数据
- prediction = gmm.predict(data)
- print(prediction)
- # 将分组结果输出到 CSV 文件中
- data_ori.insert(0, '分组', prediction)
- data_ori.to_csv('./hero_out.csv', index=False, sep=',')
(3)结果可视化
①热力图呈现 features_mean 字段之间的相关性
②输出的聚类结果文件 hero_out.csv(
(3)关于代码及结果的分析
①关于引用包
首先我们会用 DataFrame 数据结构来保存读取的数据,最后的聚类结果会写入到 CSV 文件中,因此会用到 pandas 和 CSV 工具包。另外我们需要对数据进行可视化,采用热力图展现属性之间的相关性,这里会用到 matplotlib.pyplot 和 seaborn 工具包。在数据规范化中我们使用到了 Z-Score 规范化,用到了 StandardScaler 类,最后我们还会用到 sklearn 中的 GaussianMixture 类进行聚类。
②数据可视化的探索
你能看到我们将 20 个英雄属性之间的关系用热力图呈现了出来,中间的数字代表两个属性之间的关系系数,最大值为 1,代表完全正相关,关系系数越大代表相关性越大。从图中你能看出来“最大生命”“生命成长”和“初始生命”这三个属性的相关性大,我们只需要保留一个属性即可。同理我们也可以对其他相关性大的属性进行筛选,保留一个。你在代码中可以看到,我用 features_remain 数组保留了特征选择的属性,这样就将原本的 20 个属性降维到了 13 个属性。
③关于数据规范化
我们能看到“最大攻速”这个属性值是百分数,不适合做矩阵运算,因此我们需要将百分数转化为小数。我们也看到“攻击范围”这个字段的取值为远程或者近战,也不适合矩阵运算,我们将取值做个映射,用 1 代表远程,0 代表近战。然后采用 Z-Score 规范化,对特征矩阵进行规范化。
④在聚类阶段
我们采用了 GMM 高斯混合模型,并将结果输出到 CSV 文件中;这里我将输出的结果截取了一段(设置聚类个数为 30):
第一列代表的是分组(簇),我们能看到张飞、程咬金分到了一组,牛魔、白起是一组,老夫子自己是一组,达摩、典韦是一组。聚类的特点是相同类别之间的属性值相近,不同类别的属性值差异大。因此如果你擅长用典韦这个英雄,不防试试达摩这个英雄。同样你也可以在张飞和程咬金中进行切换。这样就算你的英雄被别人选中了,你依然可以有备选的英雄可以使用。
四、算法讨论
4.1EM算法的优缺点
EM算法作为一种迭代优化算法,在实际应用中具有一些优点和缺点。
(1)优点
①针对含有隐变量的概率模型,EM算法是一种有效的参数估计方法。它可以通过迭代的方式逐步优化模型参数,使得模型更好地拟合观测数据。
②EM算法在处理复杂的概率模型时表现出较强的灵活性,能够应对各种类型的隐变量模型,例如高斯混合模型、隐马尔可夫模型等。
③由于EM算法利用期望步骤(E步骤)和最大化步骤(M步骤)交替进行优化,因此可以收敛到局部最优解,尤其在凸优化的情况下,通常能够获得较好的结果。
(2)缺点
①对初始值敏感:EM算法对初始参数值敏感,不同的初始值可能导致不同的最终结果,因此需要谨慎选择初始值来保证算法的稳定性和收敛性。
②可能收敛到局部最优解:由于EM算法是一种局部优化方法,存在收敛到局部最优解而非全局最优解的风险。这意味着在参数空间中可能会陷入局部极小值点,而无法发现全局最优解。
③计算复杂度高:在每次迭代中,EM算法需要计算数据的后验概率,并更新模型参数,这导致了在数据量较大时计算复杂度较高,导致算法效率较低。
4.2EM算法的应用
EM算法在实际中有许多广泛的应用,特别是在概率模型的参数估计、聚类分析和隐变量模型等领域。以下是一些常见的EM算法应用:
(1)高斯混合模型(Gaussian Mixture Model, GMM):EM算法常被用于对GMM的参数进行估计。GMM是一种常用的概率模型,用于对数据进行建模,尤其适用于假设数据是由多个高斯分布混合而成的情况。
(2)隐马尔可夫模型(Hidden Markov Model, HMM):HMM是一种常见的隐变量模型,用于建模时序数据。EM算法可以用于对HMM的参数进行估计,包括状态转移矩阵和观测概率矩阵。
(3)聚类分析:EM算法也被广泛应用于聚类分析中,特别是在基于概率模型的聚类方法中,如混合聚类(mixture clustering)和模型自适应聚类(model-based clustering)。
(4)数据挖掘:在数据挖掘领域,EM算法被用来处理缺失数据的填补和模式识别。它可以通过对缺失数据进行建模,估计缺失值,从而帮助进行数据清洗和分析。
(5)图像处理:在图像处理中,EM算法可以被用来进行图像分割、目标识别和特征提取等任务,尤其在需要建立概率模型对图像进行分析时发挥作用。
总的来说,EM算法在概率模型估计、参数学习和隐变量模型等领域有着广泛的应用,它为处理具有隐变量的概率模型提供了有效的数值求解方法,为各种复杂数据分析和模式识别问题提供了重要的工具。
4.3对于EM算法框架,如何选择具体的算法
在选择适用于EM算法框架的具体算法时,需要考虑数据的特性、模型的假设以及算法的实现和效率等因素。以下是一些指导原则来选择适合的算法:
(1)数据类型:如果你的数据具有连续特征,并且符合高斯分布的假设,那么高斯混合模型(GMM)可能是一个合适的选择。而如果你的数据是时序数据,并且受到隐含状态影响,比如语音信号或生物学序列,那么隐马尔可夫模型(HMM)可能更适合。
(2)模型假设:GMM假设数据由多个高斯分布混合而成,适合对具有明显聚类结构的数据进行建模;HMM假设数据由一个隐含的马尔可夫链产生,适合对时序数据进行建模。根据你的数据是否符合这些假设,可以选择相应的模型。
(3)算法实现和效率:针对具体的算法实现和计算效率,需要考虑在实际场景中的使用情况。在选择算法时,可以考虑算法的收敛速度、对初始值敏感程度、并行化能力等因素,以及算法在大规模数据集上的表现。
(4)先前研究和应用:在一些特定领域中,可能已经有关于使用GMM或HMM的成功案例和成熟的应用。在选择算法时,可以参考相关文献和先前研究,了解在特定领域中哪种算法更为常用,并根据先前的经验进行选择。
五、实验总结
在本次机器学习实验中,探究的是期望最大化EM算法。实验中我首先查找了EM的算法背景,最早是用来进行参数估计的一种算法。然后由一个两个碟子分菜的例子引入EM算法,碟子分菜中给每个碟子初始化菜量和观察预期并调整的两个步骤实际上就是期望步骤(Expectation)和最大化步骤(Maximization)。
然后分析了EM算法假设及算法原理,即四个核心部分:E步骤、M步骤、迭代更新及收敛性。
在算法推导部分,我实现了以下两个关键流程:
第一步,初始化分布参数 θ;
第二步,重复E-step 和 M-step直到收敛:
并在最后得到了EM算法。
为了复现EM算法,本次数据集使用的是王者荣耀中一些英雄的各方面数据汇总。并采用 GMM 高斯混合模型进行聚类。得到了呈现各属性间关系的热力图及输出的聚类结果。
在实验的最后,讨论了EM算法的优缺点及应用,并思考了在EM算法大框架下,如何选择一个合适的算法,如GMM和HMM。
总之,通过此次实验,对EM算法有了更深的认识和理解。EM算法通过交替地使用E步骤和M步骤,在存在隐含变量的概率模型中进行参数估计,是一种常用的机器学习算法。
2024-1-21