前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python AI 教学 | EM算法(Expectation Maximization Algorithm)及应用

Python AI 教学 | EM算法(Expectation Maximization Algorithm)及应用

作者头像
用户1621951
发布2019-10-18 15:31:26
1.9K0
发布2019-10-18 15:31:26
举报
文章被收录于专栏:数据魔术师数据魔术师

1 基本思想

1.问题引入

假设目前有100个男生和100个女生的身高,共200个数据,但是我们不知道这200个数据中哪个是男生的身高,哪个是女生的身高。假设男生、女生的身高分别服从正态分布,但每个样本从哪个分布抽取的,我们目前是不知道的。这个时候,对于每一个样本,就有两个方面需要猜测或者估计: 这个身高数据是来自于男生还是来自于女生?男生、女生身高的正态分布的参数分别是多少?EM算法要解决的问题正是这两个问题。

EM算法是一种迭代优化策略,由于它的计算方法中每一次迭代都分两步,其中一个为期望步(E步),另一个为极大步(M步),所以算法被称为EM算法(Expectation Maximization Algorithm)。EM算法受到缺失思想影响,最初是为了解决数据缺失情况下的参数估计问题。其基本思想是首先根据己经给出的观测数据,估计出模型参数的值;然后再依据上一步估计出的参数值估计缺失数据的值,再根据估计出的缺失数据加上之前己经观测到的数据重新再对参数值进行估计,然后反复迭代,直至最后收敛,迭代结束。

2.算法原理

2 在高斯混合模型中的算法实现

k-means算法是EM算法思想的体现,E步骤为聚类过程,M步骤为更新类簇中心。高斯混合模型也是EM算法的一个应用。现将高斯混合模型运用EM算法的代码附后,一起来理解EM算法的思想。

函数说明(一)

(1)np.zeros:创建指定大小的数组,数组元素以0来填充

(2)np.random.random:用于生成随机数

numpy.random.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数或N维浮点数组

numpy.random.randn(d0, d1, ..., dn):生成一个浮点数或N维浮点数组,取数范围:正态分布的随机样本数

(3)range() 函数:可创建一个整数列表,一般用在 for 循环中。

函数说明(二)

(1)Python math:模块提供了许多对浮点数的数学运算函数

(2)math.exp: 返回x的指数e^x,

函数说明(三)

(1)copy.deepcopy:深度拷贝,a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的

模拟k=2个正态分布的均值估计。其中ini_data(Sigma,Mu1,Mu2,k,N)函数用于生成训练样本,此训练样本时从两个高斯分布中随机生成的,其中高斯分布a均值Mu1=40、均方差Sigma=6,高斯分布b均值Mu2=20、均方差Sigma=6,用前面的代码实现,生成的样本分布如下图所示。

运行结果:

在上图的样本数据下,在第12步时,迭代终止,EM估计结果为:

Mu=[40.34380046 19.93288701]

3 EM应用

回到我们最开始的例子:现在一共有200个身高数据,但是我们不知道这些数据中哪些是男生的身高,哪些是女生的身高。只知道男生、女生的身高都服从正态分布。下面我们将应用EM算法来区分男生和女生的身高数据,并分别求出男女生身高数据的均值。

我们用下面的随机数函数生成了200个数据集X来模拟同学们的200个身高数据:

用上文提到的代码,对200个数据的期望参数进行求解:

提供方差、和期望的初始值及需要求解的数据:

运行结果:

经过13次迭代,得到

Mu=[159.4268008137539,18013529161584535],

十分接近我们当时生成数据时用的期望[160,180]。

责编 | 张 申

指导 | 老 薛

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据魔术师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档