11 EM算法(期望最大化)与GMM高斯混合模型(聚类算法)

期望最大化模拟:
对具体的男女生身高问题使用EM算法求解流程如下:

  1. 初始化参数:先初始化男生身高的正态分布的参数:如均值=1.64,方差=6.0;
  2. 计算分布:计算每一个人更可能属于男生分布或者女生分布;
  3. 重新估计参数:通过分为男生的n个人来重新估计男生身高分布的参数(最大似然估计),女生分布也按照相同的方式估计出来,更新分布。
  4. 这时候两个分布的概率也变了,然后重复步骤2~3,直到参数不发生变化为止。

1、EM算法简介

最大期望算法(Expectation-maximization algorithm,又译为期望最大化算法),曾入选“数据挖掘十大算法”中,可见EM算法在机器学习、数据挖掘中的影响力。EM算法是最常见的隐变量估计方法,在机器学习中有极为广泛的用途,例如常被用来学习高斯混合模型(Gaussian mixture model,简称GMM)的参数。

EM算法是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。

1.2、EM算法流程

EM算法是一种迭代优化策略,由于它的计算方法中每一次迭代都分两步,其中一个为期望步(E步),另一个为极大步(M步),所以算法被称为EM算法(Expectation-Maximization Algorithm)。

最大期望算法经过两个步骤交替进行计算:

  • 第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值
  • 第二步是最大化(M),最大化在E步上求得的最大似然值来计算参数的值。M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行。

2、极大似然

2.1、似然函数

在数理统计学中,似然函数是一种关于统计模型中的参数的函数,表示模型参数中的似然性。“似然性”与“或然性”或“概率”意思相近,都是指某种事件发生的可能性。

2.2、极大似然

而极大似然就相当于最大可能的意思。
比如一位同学和一位猎人一起外出打猎,一只野兔从前方窜过。只听一声枪响,野兔应声到下,如果要你推测,这一发命中的子弹是谁打的?你就会想,只发一枪便打中,由于猎人命中的概率一般大于那位同学命中的概率,从而推断出这一枪应该是猎人射中的。
这个例子所作的推断就体现了最大似然法的基本思想

2.3、最大似然示例计算

最大似然估计(maximum likelihood estimation, MLE)一种重要而普遍的求估计量的方法。最大似然估计明确地使用概率模型,其目标是寻找能够以较高概率产生观察数据的系统发生树。最大似然估计是一类完全基于统计的系统发生树重建方法的代表。
举例:
假如有一个罐子,里面有黑白两种颜色的球,数目多少不知,两种颜色的比例也不知。我们想知道罐中白球和黑球的比例,但我们不能把罐中的球全部拿出来数。现在我们可以每次任意从已经摇匀的罐中拿一个球出来,记录球的颜色,然后把拿出来的球再放回罐中。这个过程可以重复,我们可以用记录的球的颜色来估计罐中黑白球的比例。假如在前面的一百次重复记录中,有七十次是白球,请问罐中白球所占的比例最有可能是多少?
通过计算:
P = C 100 30 p 70 ( 1 − p ) 30 P = C_{100}^{30}p^{70}(1-p)^{30} P=C10030p70(1p)30
p > 0 , 1 − p > 0 p > 0,1- p > 0 p>01p>0,所以上面概率想要求最大值,那么求导数即可!
P ′ = 70 ∗ p 69 ∗ ( 1 − p ) 30 + p 70 ∗ 30 ∗ ( 1 − p ) 29 ∗ ( − 1 ) P' = 70*p^{69}*(1-p)^{30} + p^{70}*30*(1-p)^{29}*(-1) P=70p69(1p)30+p7030(1p)29(1)
p = 70 p = 70% p=70

2.4、极大似然步骤

  1. 写出似然函数;
  2. 对似然函数取对数,并整理;
  3. 求导数,令导数为0,得到似然方程;
  4. 解似然方程,得到的参数即为所求;

3、EM算法入门

我们需要调查学校的男生和女生的身高分布 ,我们抽取100个男生和100个女生,将他们按照性别划分为两组。
然后,统计抽样得到100个男生的身高数据和100个女生的身高数据。
我们知道他们的身高服从正态分布(自然属性一般服从正态分布),但分布的均值 μ \mu μ 和方差 σ 2 \sigma^2 σ2 是未知的,就是要估计的参数

问题:我们知道样本所服从的概率分布模型和一些样本,我们需要求解该模型的参数。

  • 我们已知的条件有两个:
    • 样本服从的分布模型(正态分布)
    • 随机抽取的样本。
  • 我们需要求解模型的参数。
    根据已知条件,通过极大似然估计,求出未知参数。
    总的来说:极大似然估计就是用来估计模型参数的统计学方法。

多数情况下,我们是根据已知条件来推算结果,而极大似然估计是已知结果,寻求使该结果出现的可能性最大的条件,以此作为估计值。

4、EM算法进阶

4.1、聚类问题

我们目前有100个男生和100个女生的身高,但是我们不知道这200个数据中哪个是男生的身高,哪个是女生的身高,即抽取得到的每个样本都不知道是从哪个分布中抽取的。
这个时候,对于每个样本,就有两个未知量需要估计:

  1. 这个身高数据是来自于男生数据集合还是来自于女生?(聚类问题)
  2. 男生、女生身高数据集的正态分布的参数分别是多少?

4.2、解决方案

对具体的男女生身高问题使用EM算法求解流程如下:

  1. 初始化参数:先初始化男生身高的正态分布的参数:如均值=1.64,方差=6.0;
  2. 计算分布:计算每一个人更可能属于男生分布或者女生分布;
  3. 重新估计参数:通过分为男生的n个人来重新估计男生身高分布的参数(最大似然估计),女生分布也按照相同的方式估计出来,更新分布。
  4. 这时候两个分布的概率也变了,然后重复步骤2~3,直到参数不发生变化为止。

5、Jensen不等式

设f是定义域为实数的函数,如果对所有的实数x,f(x)的二阶导数都大于0,那么f是凸函数。
Jensen不等式定义如下:
如果f是凸函数,X是随机变量,那么: E [ f ( X ) ] ≥ f ( E ( X ) ) E[f(X)] \ge f(E(X)) E[f(X)]f(E(X))。当且仅当X是常量时,该式取等号。其中,E(X)表示X的数学期望。
注:Jensen不等式应用于凹函数时,不等号方向反向。当且仅当x是常量时,该不等式取等号

总结如下:

  1. 如果f是凸函数,X是随机变量,那么:E[f(X)]>=f(E[X]),通俗的说法是函数的期望大于等于期望的函数。
  2. 特别地,如果f是严格凸函数,当且仅当P(X = EX) = 1,即X是常量时,上式取等号,即E[f(X)] = f(EX)。

6、EM算法公式推导

暂不深入研究

7、GMM高斯混合模型(默认数据属于正太分布)

高斯混合模型是一个用于聚类的概率模型,其使用了EM算法进行迭代计算,高斯混合模型假设每个簇的数据都是符合高斯分布(又叫正态分布)的,当前数据呈现的分布就是各个簇的高斯分布叠加在一起的结果。

高斯分布的概率密度函数为:
p ( x i ∣ μ , σ 2 ) = 1 2 π σ e − ( x i − μ ) 2 2 σ 2 p(x_i|\mu,\sigma^2) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x_i - \mu)^2}{2\sigma^2}} p(xiμ,σ2)=2π σ1e2σ2(xiμ)2

GMM算法,是EM算法的一种落地实现方式

GMM算法示例

import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.cluster import KMeans
# 创建数据,并可视化
X,y = datasets.make_blobs(n_samples=1500,
                             cluster_std=[1.0, 2.5, 0.5],
                             random_state=170)
plt.figure(figsize=(12,4))
plt.rcParams['font.family'] = 'STKaiti'
plt.rcParams['font.size'] = 20
plt.subplot(1,3,1)
plt.scatter(X[:,0],X[:,1],c = y)
plt.title('原始数据',pad = 20)

# Kmeans聚类
kmeans = KMeans(3)
kmeans.fit(X)
y_ = kmeans.predict(X)
plt.subplot(1,3,2)
plt.scatter(X[:,0],X[:,1],c = y_)
plt.title('KMeans聚类效果',pad = 20)

# GMM高斯混合模型聚类
gmm = GaussianMixture(n_components=3)
y_ = gmm.fit_predict(X)
plt.subplot(1,3,3)
plt.scatter(X[:,0],X[:,1],c = y_)
plt.title('GMM聚类效果',pad = 20)

plt.figtext(x = 0.51,y = 1.1,s = 'KMeans VS GMM',ha = 'center',fontsize = 30)
plt.savefig('./GMM高斯混合模型.png',dpi = 200)

你可能感兴趣的:(机器学习,算法,聚类)