天天看点

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

EM聚类

最大期望算法(Expectation-Maximization algorithm, EM)是一类通过迭代进行极大似然估计(Maximum Likelihood Estimation, MLE)的优化算法 ,通常作为牛顿迭代法(Newton-Raphson method)的替代用于对包含隐变量(latent variable)或缺失数据(incomplete-data)的概率模型进行参数估计 。

EM算法的标准计算框架由E步(Expectation-step)和M步(Maximization step)交替组成,算法的收敛性可以确保迭代至少逼近局部极大值。EM算法是MM算法(Minorize-Maximization algorithm)的特例之一,拥有多个改进版本,包括EM梯度算法、广义EM算法等 。

下面是我对EM算法理解的思维导图:

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

EM算法相当于一个聚类框架,里面有不同的聚类模型,比如GMM高斯混合模型,或HMM隐马尔科夫模型。本次练习采用的是GMM高斯混合模型

我们通过聚类算法将特征值相近的数据归为一类,不同类之间的差异较大,这样就可以对原始数据进行降维度。通过分成几个组来研究每组的特征。比如我们该案例中对王者荣耀英雄进行分类。如果你的对手选择你擅长的英雄之后,你就可以从同类别中选择另一个英雄作为备选。

分析流程

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

获得数据

文件名:heros.csv

xiujiayou/python-sklearn​github.com

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

理解数据

数据有69个英雄的20个特征,这些属性分别是最大生命、生命成长、初始生命、最大法力、法力成长、初始法力、最高物攻、物攻成长、初始物攻、最大物防、物防成长、初始物防、最大每 5 秒回血、每 5 秒回血成长、初始每 5 秒回血、最大每 5 秒回蓝、每 5 秒回蓝成长、初始每 5 秒回蓝、最大攻速和攻击范围等

首先导入包和加载数据源
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄
对英雄属性之间的关系进行可视化分析
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

从图中我们能清晰地看出哪些特征的相关性程度高。我们就从哪些相关性程度高的特征里面只选出一个代表该特征,这样能对属性进行降维。

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄
然后进行数据规范化
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

我们能看到“最大攻速”这个属性值是百分数,不适合做矩阵运算,因此我们需要将百分数转化为小数。我们也看到“攻击范围”这个字段的取值为远程或者近战,也不适合矩阵运算,我们将取值做个映射,用 1 代表远程,0 代表近战。然后采用 Z-Score 规范化,对特征矩阵进行规范化。

构造GMM聚类
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

训练数据

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄
输出结果
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

截图一部分结果

python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄
评估模型效果
python gmm em算法 2维数据_实战:用EM聚类划分王者荣耀英雄

聚类和分类不一样,聚类是无监督的学习方式,也就是我们没有实际的结果可以进行比对,所以聚类的结果评估不像分类准确率一样直观,那么有没有聚类结果的评估方式呢?这里我们可以采用 Calinski-Harabaz 指标