Слава короля была вокруг так долго, но все еще не король? Ха-ха-ха, посмотрев на это, вы не достаточно хорошо понимаете героев? Разве вы плохо отсортировали героев? Давайте сегодня посмотрим на классификацию героев.
стек технологий
1. Введение в кластеризацию EM
2. Сканирование начальных значений атрибутов героев в интернете
3. Сделайте круговую диаграмму
Введение в кластеризацию EM
Английское название EM - это максимизация ожидания, также известная как максимальный алгоритм ожидания.
В статистических вычислениях алгоритм максимума ожидания (EM) представляет собой алгоритм для нахождения максимальной вероятности или максимальной апостериорной оценки параметров в вероятностных моделях, которые полагаются на ненаблюдаемые скрытые переменные.
Алгоритм максимального ожидания вычисляется поочередно в два шага: первый шаг — вычислить математическое ожидание (Е) и использовать существующее оценочное значение скрытой переменной для вычисления ее оценки максимального правдоподобия, второй шаг — максимизировать (М), максимум Значение максимального правдоподобия, полученное на шаге E, используется для вычисления значения параметра. Оценки параметров, найденные на шаге М, используются в расчете следующего шага Е, который непрерывно чередуется.
Выполнить кластеризацию героев
Используйте структуру алгоритма кластеризации EM в библиотеке sklearn, используя смешанную модель Гаусса.
from sklearn.mixture import GaussianMixture
Ниже приведены значения некоторых основных параметров, другие параметры можно просмотреть в соответствующих документах.
-
n_components: количество смешанных моделей Гаусса, то есть желаемое количество кластеров, по умолчанию 1
-
COVARANECE_TYPE: COVARICCE TYPS, в том числе {«полные», «привязанные», «подразделение», «сферические»} являются четыреми соответствующими полной ковариационной матрицей (элементами не нулю), полная ковариационная матрица того же (используется HMM), диагональ Ковариальная матрица (ненулевая диагональ, диагональ не нулевой), ковариационная матрица сферической (ненулевой диагональю, диагональ идентичных сферических поверхностных характеристик), по умолчанию «полная» полная ковариация матрицы
-
MAX_ITER: максимальная итерация, по умолчанию 100.
Таким образом, кластеризация GMM может быть построена следующим образом:
# 构造 GMM 聚类
gmm = GaussianMixture(n_components=20, covariance_type='full')
Есть данные со следующей структурой:
Как видите, задействовано много свойств, и начальные настройки свойств следующие:
feature = ['1级物理攻击', '15级物理攻击', '每级成长',
'1级生命', '15级生命', '生命成长值', '1级物理防御',
'15级物理防御', '每级物理防御成长', '攻速成长',
'1级每5秒回血', '15级每5秒回血', '1级最大法力',
'15级最大法力', '最大法力成长', '1级每五秒回蓝',
'15级每5秒回蓝', '近/远程?', '移速', '定位', '个人建议分路']
уменьшение размерности атрибута
Вы можете сначала определить, какие атрибуты сильно коррелированы с помощью тепловой карты, и оставить только уникальные атрибуты.
import seaborn as sns
import matplotlib.pyplot as plt
corr = data[feature].corr()
plt.figure(figsize=(14, 14))
sns.heatmap(corr, annot=True)
plt.show()
Видно, что «Максимальные максимальные маниферы уровня 1», «Максимальные матементы уровня 15», «Максимальный ручной рост» является сильным, тем самым создавая скрининг атрибута, окончательный зарезервированный атрибут выглядит следующим образом:
features_remain = ['15级生命', '15级物理攻击',
'15级物理防御', '15级最大法力',
'15级每5秒回血', '15级每5秒回蓝', '移速',
'攻速成长', '近/远程?']
нормализация данных
Преобразуйте поле дальности атаки ("Near/Range?") в 0 и 1.
data_new['近/远程?'] = data_new['近/远程?'].map({'远程': 1, '近程': 0})
Расчет электромагнитного кластера
Используйте режим наложения по Гауссу и запишите полученные категории в CSV-файл.
# 构造 GMM 聚类
gmm = GaussianMixture(n_components=20, covariance_type='full')
gmm.fit(data_new)
# 训练数据
prediction = gmm.predict(data_new)
# print(prediction)
hero_data.insert(0, '分组', prediction)
hero_data.to_csv('hero_out.csv', index=False, sep=',', encoding='gb18030')
Вывод круговой диаграммы
Для более интуитивного представления каждого пакета, где герой, как используется в данном документе, визуализация пирога Во-первых, извлеченные данные «пакет» и «имя» два поля, а поле «Группа» обработки пакетов
df = hero_data[['分组', '名称']]
grouped = df.groupby(['分组'])
Затем выньте значения в группе и используйте круговые диаграммы, чтобы нарисовать круговую диаграмму.
from pyecharts import Pie
k = []
for name, group in grouped:
k.append({name: list(group['名称'].values)})
kk = []
for i in k:
for k, v in i.items():
kk.append(v)
length = []
key = []
for i in kk:
key.append(str(i))
length.append(len(i))
pie = Pie('英雄完全属性分类图', title_pos='center')
pie.add("", key, length,
is_label_show=True, legend_pos="bottom", legend_orient="vertical",)
pie.render()
Захватите начальные атрибуты героя
Если вы хотите получить более полные данные о героях, вам все равно нужно сканировать информацию в Интернете, чтобы убедиться, что количество героев актуально. Здесь я используюdb.18183.com/Данные сайта, страницы следующие:
Получить URL главной страницы
Используйте BeautifulSoup, чтобы найти элемент ul, чей класс — mod-iconlist, в котором хранятся страницы каждого героя.
url = 'http://db.18183.com/'
url_list = []
res = requests.get(url + 'wzry').text
content = BeautifulSoup(res, "html.parser")
ul = content.find('ul', attrs={'class': "mod-iconlist"})
hero_url = ul.find_all('a')
for i in hero_url:
url_list.append(i['href'])
Сведения о сканировании
Циркулирует список URL, возьмите детали каждого героя
base_url = 'http://db.18183.com/'
detail_list = []
for i in url:
# print(i)
res = requests.get(base_url + i).text
content = BeautifulSoup(res, "html.parser")
name_box = content.find('div', attrs={'class': 'name-box'})
name = name_box.h1.text
hero_attr = content.find('div', attrs={'class': 'attr-list'})
attr_star = hero_attr.find_all('span')
survivability = attr_star[0]['class'][1].split('-')[1]
attack_damage = attr_star[1]['class'][1].split('-')[1]
skill_effect = attr_star[2]['class'][1].split('-')[1]
getting_started = attr_star[3]['class'][1].split('-')[1]
details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
# print(details)
attrs = details.find_all('p')
attr_list = []
for attr in attrs:
attr_list.append(attr.text.split(':')[1].strip())
detail_list.append([name, survivability, attack_damage,
skill_effect, getting_started, attr_list])
сохранить в CSV-файл
открыть файл и сохранить соответствующие поля списка в
with open('all_hero_init_attr.csv', 'w', encoding='gb18030') as f:
f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
'法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
'暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
for i in details:
try:
rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
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],
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],
i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
)
f.write(rowcsv)
f.write('\n')
except:
continue
очистка данных
Поскольку этот веб-сайт может быть не очень осторожным, некоторые атрибуты будут иметь два знака процента и пустой регистр, как показано на рисунке:
Так что с этим нужно разобраться.
Для двухпроцентных знаков используйте NOTEPAD++, чтобы заменить все %% на один %
Для пустых полей используйте следующий код для обработки, заполните 0
# 把空值设置为0
data_init = data_init.fillna(0)
Заканчивать
Для нормализации данных GMM-кластеризация и представление круговой диаграммы аналогичны предыдущим, поэтому я не буду повторять их, давайте посмотрим на эффект круговой диаграммы.
Хотя с помощью этих двух круговых диаграмм сразу улучшить свою проблему с гандикапом нельзя, но классификация героев уточняется, не на шаг ли ближе к королю?
Полный код здесь:Github.com/around713/...