天天看点

读书笔记(5) |EM算法及应用

1

基本思想

1.问题引入

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

读书笔记(5) |EM算法及应用

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

2.数学原理

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

2

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

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

读书笔记(5) |EM算法及应用

函数说明(一)

读书笔记(5) |EM算法及应用

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

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

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

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

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

函数说明(二)

读书笔记(5) |EM算法及应用

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

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

函数说明(三)

读书笔记(5) |EM算法及应用

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

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

读书笔记(5) |EM算法及应用

运行结果:

读书笔记(5) |EM算法及应用

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

Mu=[40.34380046 19.93288701]

3

EM应用

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

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

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

读书笔记(5) |EM算法及应用
读书笔记(5) |EM算法及应用

经过13次迭代,得到