EM聚类

作者: dingtom | 来源:发表于2021-04-19 23:23 被阅读0次

原理

“最大似然”,英文是 Maximum Likelihood,Likelihood 代表可能性,所以最大似然也就是最大可能性的意思。

最大似然:根据我们的经验,相同年龄下男性的平均身高比女性的高一些

最大似然估计: 它指的就是一件事情已经发生了,然后反推更有可能是什么因素造成的。还是用一男一女比较身高为例,假设有一个人比另一个人高,反推他可能是男性。最大似然估计是一种通过已知结果,估计参数的方法。

EM 算法是一种求解最大似然估计的方法,通过观测样本,来找出样本的模型参数。

练习

假设我们有 A 和 B 两枚硬币,我们做了 5 组实验,每组实验投掷 10 次,每次只能只有A或者B一枚硬币。那么我们统计出现每组实验正面的次数,实验结果如下:

虽然B出现正面次数为5的概率比A的小,但是也不是0。这时候我们应该考虑进这种可能的情况,那么这时候,第一轮实验用的A的概率就是: 0.246 / (0.246 + 0.015) = 0.9425;用B的概率就是1-0.9425 = 0.0575。

有0.9425的概率是硬币A,有0.0575的概率是硬币B,不再是非此即彼。这样我们在估计θAθB时,就可以用上每一轮实验的数据,而不是某几轮实验的数据,显然这样会更好一些。这一步,我们实际上估计的是用A或者B的一个概率分布,这步就称作E步

以硬币A为例, 第一轮的正面次数为5相当于 5次正面,5次反面

0.9425 * 5 = 4.7125(这是正面),0.9425 * 5 = 4.7125(这是反面)

新的θA = 4.22 / (4.22+7.98)=0.35 这样,改变了硬币A和B的估计方法之后,会发现,新估计的θA会更加接近真实的值,因为我们使用了每一轮的数据,而不是某几轮的数据。 这步中,我们根据E步求出了硬币A和B在每一轮实验中的一个概率分布,依据最大似然法则结合所有的数据去估计新的θAθB, 被称作M步

总结

EM算法可以先给无监督学习估计一个隐状态(即标签),有了标签,算法模型就可以转换成有监督学习,这时就可以用极大似然估计法求解出模型最优参数。其中估计隐状态流程应为EM算法的E步,后面用极大似然估计为M步。

EM 算法相当于一个框架,你可以采用不同的模型来进行聚类,比如 GMM(高斯混合模型),或者 HMM(隐马尔科夫模型)来进行聚类。

  • GMM 是通过概率密度来进行聚类,聚成的类符合高斯分布(正态分布)。

  • 而 HMM 用到了马尔可夫过程,在这个过程中,我们通过状态转移矩阵来计算状态转移的概率。HMM 在自然语言处理和语音识别领域中有广泛的应用。

Sklearn

GaussianMixture(n_components=1, covariance_type='full', max_iter=100)

  • n_components:即高斯混合模型的个数,也就是我们要聚类的个数,默认值为 1。如果你不指定 n_components,最终的聚类结果都会为同一个值。
  • covariance_type:代表协方差类型。一个高斯混合模型的分布是由均值向量和协方差矩阵决定的,所以协方差的类型也代表了不同的高斯混合模型的特征。协方差类型有 4 种取值:
    covariance_type=full,代表完全协方差,也就是元素都不为 0;
    covariance_type=tied,代表相同的完全协方差;
    covariance_type=diag,代表对角协方差,也就是对角不为 0,其余为 0;
    covariance_type=spherical,代表球面协方差,非对角为 0,对角完全相同,呈现球面的特性。
  • max_iter:代表最大迭代次数,EM 算法是由 E 步和 M 步迭代求得最终的模型参数,这里可以指定最大迭代次数,默认值为 100。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.mixture import GaussianMixture
#from sklearn import datasets
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

# 采用Z-Score规范化数据,保证每个特征维度的数据均值为0,方差为1
ss = StandardScaler()
X = ss.fit_transform(X)

#绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()
 
# 构造GMM聚类
gmm = GaussianMixture(n_components=3, covariance_type='full')
gmm.fit(X)
# 训练数据
label_pred = gmm.predict(X)
print('聚类结果', '\n', label_pred)  # (150,) [1 1 1 1 1 2 2 2 2 2 0 2 2 2 2 0 2 2 ...]
print('真实类别', '\n', y)

x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
print(x0.shape, x1.shape, x2.shape)  # (62, 4) (50, 4) (38, 4)
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1')
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()
from sklearn.metrics import calinski_harabasz_score
print(calinski_harabasz_score(X, label_pred))
# 指标分数越高,代表聚类效果越好,也就是相同类中的差异性小,不同类之间的差异性大。当
# 然具体聚类的结果含义,我们需要人工来分析,也就是当这些数据被分成不同的类别之后,具体每个类表代表的含义。

相关文章

  • EM聚类

    原理 “最大似然”,英文是 Maximum Likelihood,Likelihood 代表可能性,所以最大似然也...

  • 聚类算法 - EM

    一、算法简介 EM(Expectation-Maximum)算法也称期望最大化算法。EM算法是最常见的隐变量估计方...

  • K-MEANS聚类k-means+python︱scikit-l

    聚类分析在客户细分中极为重要。有三类比较常见的聚类模型,K-mean聚类、层次(系统)聚类、最大期望EM算法。在聚...

  • 03 EM算法 - EM算法流程和直观案例

    02 EM算法 - K-means算法回顾、EM概述 利用EM算法处理聚类问题的步骤: 样本数据x={x1,x2,...

  • 机器学习笔记 - 20. EM算法实践(讲师:邹博)

    主要内容 多维高斯混合分布聚类 EM算法的聚类效果或许比K均值聚类好一些。 如图,对于二维数据形成概率密度曲线,或...

  • 02-17

    今天看的是EM聚类最大期望算法。通过初始化参数,生成预期结果,并对其进行重新估计,再利用不同的混合模型进行聚类操作...

  • 基于EM算法的聚类R包mclust

    简介 mclust是一种基于高斯混合分布,利用EM算法聚类的方法:mclust文献转送[https://journ...

  • 3-BLMa白龙马C#代码生成器-参数设置详解2

    3.1EM实体模型参数 3.1.1EM命名空间 设置生成EM实体的命名空间。 3.1.2EM类后缀名 设置EM实体...

  • EM 思想

    以Kmeans和GMM为例,阐述EM思想。 Kmeans kmeans是一种相当简单和直观的聚类算法,主要分类两步...

  • 用EM思想估计GMM(高斯混合聚类)

    EM算法(Expectation Maximization Algorithm),通过求参数的最大似然估计,解决含...

网友评论

      本文标题:EM聚类

      本文链接:https://www.haomeiwen.com/subject/tmpwlltx.html