把英雄分类,看 Python 带你上王者

简介: 把英雄分类,看 Python 带你上王者

王者荣耀这么久了,还没上王者?哈哈哈,看过来,是不是对英雄理解的不够透彻呢,是不是还没有很好的为英雄分类呢,今天就来看看英雄分类

技术栈

一、EM 聚类简介

二、爬取网上的英雄初始属性值

三、做成饼图

EM 聚类简介

EM 英文名是 Expectation Maximization,也叫最大期望算法。

在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。

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

进行英雄聚类

使用 sklearn 库中的的 EM 聚类算法框架,采用高斯混合模型

1from sklearn.mixture import GaussianMixture

一些主要参数意义如下,其他参数可以查看相关文档

  1. n_components:混合高斯模型个数,也就是想要的聚类个数,默认为1
  2. covariance_type:协方差类型,包括{‘full’,‘tied’, ‘diag’, ‘spherical’}四种,分别对应完全协方差矩阵(元素都不为零),相同的完全协方差矩阵(HMM会用到),对角协方差矩阵(非对角为零,对角不为零),球面协方差矩阵(非对角为零,对角完全相同,球面特性),默认‘full’ 完全协方差矩阵
  3. max_iter:最大迭代次数,默认100

所以可以构造 GMM 聚类如下:

1# 构造 GMM 聚类
2gmm = GaussianMixture(n_components=20, covariance_type='full')

有一份如下结构的数据:

可以看到,涉及到的属性非常多,初始的属性设置如下:

1feature = ['1级物理攻击', '15级物理攻击', '每级成长',
2           '1级生命', '15级生命', '生命成长值', '1级物理防御',
3           '15级物理防御', '每级物理防御成长', '攻速成长',
4           '1级每5秒回血', '15级每5秒回血', '1级最大法力',
5           '15级最大法力', '最大法力成长', '1级每五秒回蓝',
6           '15级每5秒回蓝', '近/远程?', '移速', '定位', '个人建议分路']

属性降维

可以先通过热力图来判断下哪些属性是强相关的,只保留唯一属性

1import seaborn as sns
2import matplotlib.pyplot as plt
3
4corr = data[feature].corr()
5plt.figure(figsize=(14, 14))
6sns.heatmap(corr, annot=True)
7plt.show()



可以看到,其中”1级最大法力“,”15级最大法力“,”最大法力成长“,是强相关的,由此可以做出属性筛选,最终保留的属性如下:

1features_remain = ['15级生命', '15级物理攻击',
2                   '15级物理防御', '15级最大法力',
3                   '15级每5秒回血', '15级每5秒回蓝', '移速',
4                   '攻速成长', '近/远程?']

数据规范化

将攻击范围字段(”近/远程?“)转换为 0 和 1

1data_new['近/远程?'] = data_new['近/远程?'].map({'远程': 1, '近程': 0})

EM 聚类计算

采用高斯混合模式,并把生成的类别写入 csv 文件中

1# 构造 GMM 聚类
 2gmm = GaussianMixture(n_components=20, covariance_type='full')
 3gmm.fit(data_new)
 4
 5# 训练数据
 6prediction = gmm.predict(data_new)
 7# print(prediction)
 8
 9hero_data.insert(0, '分组', prediction)
10hero_data.to_csv('hero_out.csv', index=False, sep=',', encoding='gb18030')

饼图输出

为了更加直观的查看各个英雄的分组情况,这里使用饼图来做可视化

首先取出数据的”分组“和”名称“两个字段,并对”分组“字段进行分组处理

1df = hero_data[['分组', '名称']]
2grouped = df.groupby(['分组'])

然后取出分组中的数值,并用 pyecharts 来画饼图

1from pyecharts import Pie
 2
 3k = []
 4for name, group in grouped:
 5    k.append({name: list(group['名称'].values)})
 6
 7kk = []
 8for i in k:
 9    for k, v in i.items():
10        kk.append(v)
11
12length = []
13key = []
14for i in kk:
15    key.append(str(i))
16    length.append(len(i))
17pie = Pie('英雄完全属性分类图', title_pos='center')
18pie.add("", key, length,
19        is_label_show=True, legend_pos="bottom", legend_orient="vertical",)
20pie.render()


抓取英雄初始属性

要想获得更加全的英雄数据,还是需要到网上抓取,这样才能够保证英雄的数量是最新的。这里我使用的是 http://db.18183.com/ 网站的数据,页面如下:


获取英雄页面 URL

使用 BeautifulSoup 来定位到 class 为 mod-iconlist 的 ul 元素,里面保存的就是各个英雄的页面

1    url = 'http://db.18183.com/'
2    url_list = []
3    res = requests.get(url + 'wzry').text
4    content = BeautifulSoup(res, "html.parser")
5    ul = content.find('ul', attrs={'class': "mod-iconlist"})
6    hero_url = ul.find_all('a')
7    for i in hero_url:
8        url_list.append(i['href'])

抓取详细信息

循环抓取到的 URL 列表,抓取每个英雄的详细信息

1    base_url = 'http://db.18183.com/'
 2    detail_list = []
 3    for i in url:
 4        # print(i)
 5        res = requests.get(base_url + i).text
 6        content = BeautifulSoup(res, "html.parser")
 7        name_box = content.find('div', attrs={'class': 'name-box'})
 8        name = name_box.h1.text
 9        hero_attr = content.find('div', attrs={'class': 'attr-list'})
10        attr_star = hero_attr.find_all('span')
11        survivability = attr_star[0]['class'][1].split('-')[1]
12        attack_damage = attr_star[1]['class'][1].split('-')[1]
13        skill_effect = attr_star[2]['class'][1].split('-')[1]
14        getting_started = attr_star[3]['class'][1].split('-')[1]
15        details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
16        # print(details)
17        attrs = details.find_all('p')
18        attr_list = []
19        for attr in attrs:
20            attr_list.append(attr.text.split(':')[1].strip())
21        detail_list.append([name, survivability, attack_damage,
22                            skill_effect, getting_started, attr_list])

保存到 csv 文件

open 一个文件,把对应的列表字段存入

1    with open('all_hero_init_attr.csv', 'w', encoding='gb18030') as f:
 2        f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
 3                '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
 4                '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
 5        for i in details:
 6            try:
 7                rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
 8                    i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
 9                    i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
10                    i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
11                )
12                f.write(rowcsv)
13                f.write('\n')
14            except:
15                continue

数据清理

因为这个网站可能做的不是很用心,有些属性会存在两个百分号和为空的情况,如图:

所以需要处理下。

对于两个百分号,直接使用 notepad++ 把所有的 %% 的替换为单 % 即可

对于为空的字段,使用如下代码处理,填为 0

1# 把空值设置为0
2data_init = data_init.fillna(0)

完成

对于数据规范化,GMM 聚类和饼图呈现,都和前面类似,不再赘述,下面来看看饼图效果

虽然通过这两张饼图,没有办法一下子提高你手残的毛病,但是明确了英雄的分类,不是离王者更近了一步吗

完整代码在这里:

https://github.com/zhouwei713/data_analysis/tree/master/analyse_of_King_glory

相关文章
|
2月前
|
Python
Python办公自动化:xlwings对Excel进行分类汇总
Python办公自动化:xlwings对Excel进行分类汇总
88 1
|
3月前
|
机器学习/深度学习 算法 数据挖掘
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析
本文介绍了2023年第二届钉钉杯大学生大数据挑战赛初赛A题的Python代码分析,涉及智能手机用户监测数据分析中的聚类分析和APP使用情况的分类与回归问题。
87 0
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析
|
15天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
39 3
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
93 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
安全 Python
Python脚本实现IP按段分类
【10月更文挑战第04天】
27 7
|
1月前
|
存储 Python 容器
Python 对象有哪几种,我们可以从哪些角度进行分类呢?
Python 对象有哪几种,我们可以从哪些角度进行分类呢?
16 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
49 9
|
3月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
|
3月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【8月更文挑战第2天】决策树算法以其直观性和解释性在机器学习领域中独具魅力,尤其擅长处理非线性关系。相较于复杂模型,决策树通过简单的分支逻辑实现数据分类,易于理解和应用。本示例通过Python的scikit-learn库演示了使用决策树对鸢尾花数据集进行分类的过程,并计算了预测准确性。虽然决策树优势明显,但也存在过拟合等问题。即便如此,无论是初学者还是专家都能借助决策树的力量提升数据分析能力。
44 4
|
3月前
|
机器学习/深度学习 数据挖掘 Python
简单几步,教你使用scikit-learn做分类和回归预测
简单几步,教你使用scikit-learn做分类和回归预测
下一篇
无影云桌面