├── heros.csv ├── .gitattributes └── here_em.py /heros.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cystanford/EM_data/HEAD/heros.csv -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /here_em.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import pandas as pd 3 | import csv 4 | import matplotlib.pyplot as plt 5 | import seaborn as sns 6 | from sklearn.mixture import GaussianMixture 7 | from sklearn.preprocessing import StandardScaler 8 | 9 | # 数据加载,避免中文乱码问题 10 | data_ori = pd.read_csv('./heros7.csv', encoding = 'gb18030') 11 | features = [u'最大生命',u'生命成长',u'初始生命',u'最大法力', u'法力成长',u'初始法力',u'最高物攻',u'物攻成长',u'初始物攻',u'最大物防',u'物防成长',u'初始物防', u'最大每5秒回血', u'每5秒回血成长', u'初始每5秒回血', u'最大每5秒回蓝', u'每5秒回蓝成长', u'初始每5秒回蓝', u'最大攻速', u'攻击范围'] 12 | data = data_ori[features] 13 | 14 | # 对英雄属性之间的关系进行可视化分析 15 | # 设置 plt 正确显示中文 16 | plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 17 | plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号 18 | # 用热力图呈现 features_mean 字段之间的相关性 19 | corr = data[features].corr() 20 | plt.figure(figsize=(14,14)) 21 | # annot=True 显示每个方格的数据 22 | sns.heatmap(corr, annot=True) 23 | plt.show() 24 | 25 | # 相关性大的属性保留一个,因此可以对属性进行降维 26 | features_remain = [u'最大生命', u'初始生命', u'最大法力', u'最高物攻', u'初始物攻', u'最大物防', u'初始物防', u'最大每5秒回血', u'最大每5秒回蓝', u'初始每5秒回蓝', u'最大攻速', u'攻击范围'] 27 | data = data_ori[features_remain] 28 | data[u'最大攻速'] = data[u'最大攻速'].apply(lambda x: float(x.strip('%'))/100) 29 | data[u'攻击范围']=data[u'攻击范围'].map({'远程':1,'近战':0}) 30 | # 采用 Z-Score 规范化数据,保证每个特征维度的数据均值为 0,方差为 1 31 | ss = StandardScaler() 32 | data = ss.fit_transform(data) 33 | # 构造 GMM 聚类 34 | gmm = GaussianMixture(n_components=30, covariance_type='full') 35 | gmm.fit(data) 36 | # 训练数据 37 | prediction = gmm.predict(data) 38 | print(prediction) 39 | # 将分组结果输出到 CSV 文件中 40 | data_ori.insert(0, '分组', prediction) 41 | data_ori.to_csv('./hero_out.csv', index=False, sep=',') 42 | 43 | from sklearn.metrics import calinski_harabaz_score 44 | print(calinski_harabaz_score(data, prediction)) 45 | --------------------------------------------------------------------------------