从0到1数据分析实战学习笔记(十)EM算法对王者荣耀英雄进行划分

EM算法的工作原理

说到EM算法,我们先来看一个概念“最大似然”,英文是Maximum Likelihood,Likelihood代表可能性,所以最大似然也就是最大可能性的意思。

什么是最大似然呢?举个例子,有一男一女两个同学,现在要对他俩进行身高的比较,谁会更高呢?根据我们的经验,相同年龄下男性的平均身高比女性的高一些,所以男同学高的可能性会很大。这里运用的就是最大似然的概念。

最大似然估计是什么呢?它指的就是一件事情已经发生了,然后反推更有可能是什么因素造成的。还是用一男一女比较身高为例,假设有一个人比另一个人高,反推他可能是男性。最大似然估计是一种通过已知结果,估计参数的方法。
从0到1数据分析实战学习笔记(十)EM算法对王者荣耀英雄进行划分_第1张图片

项目实战

用EM算法对王者荣耀数据进行聚类,我们收集了69名英雄的20个特征属性,这些属性分别是最大生命、生命成长、初始生命、最大法力、法力成长、初始法力、最高物攻、物攻成长、初始物攻、最大物防、物防成长、初始物防、最大每5秒回血、每5秒回血成长、初始每5秒回血、最大每5秒回蓝、每5秒回蓝成长、初始每5秒回蓝、最大攻速和攻击范围等。

具体的数据集你可以在GitHub上下载:https://github.com/fuzhipeng/EM_data

现在我们需要对王者荣耀的英雄数据进行聚类

完整的代码为

#-*- coding : utf-8 -*-
# coding: utf-8
import pandas as pd
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
import csv

data1 = pd.read_csv('./heros.csv')
# 相关性大的属性保留一个,因此可以对属性进行降维
features_remain = [u'最大生命', u'初始生命', u'最大法力', u'最高物攻', u'初始物攻', u'初始物攻', u'最大物防', u'初始物防', u'最大每5秒回血', u'最大每5秒回蓝', u'初始每5秒回蓝', u'最大攻速', u'攻击范围']
data = data1[features_remain]
print(data)

data[u'最大攻速'] = data[u'最大攻速'].apply(lambda x: float(x.strip('%'))/100)
data[u'攻击范围']=data[u'攻击范围'].map({'远程':1,'近战':0})

# 采用Z-Score规范化数据,保证每个特征维度的数据均值为0,方差为1
ss = StandardScaler()
data = ss.fit_transform(data)
# 构造GMM聚类
gmm = GaussianMixture(n_components=30, covariance_type='full')
gmm.fit(data)
# 训练数据
prediction = gmm.predict(data)
print(prediction)
data1.insert(0, '分组', prediction)
data1.to_csv('./hero_out.csv', index=False, sep=',')

效果如图
从0到1数据分析实战学习笔记(十)EM算法对王者荣耀英雄进行划分_第2张图片
我们可以看到按照不同的属性对英雄分好了组

总结

从0到1数据分析实战学习笔记(十)EM算法对王者荣耀英雄进行划分_第3张图片

你可能感兴趣的:(数据分析实战)