ерунда написана спереди
Недавно студенческий союз попросил меня научить языку Python одноклассников 17-го класса. В предисловии я подготовил несколько примеров, чтобы просто продемонстрировать возможности python, и программа, описанная в заголовке, — один из них.
Общая идея программы очень проста, разделена на три шага:
- Данные сканирования:Ползаниеhttps://pubg.me/Топ 100 данных на каждом сервере.
- анализировать:Проанализируйте содержимое просканированных данных и выберите соответствующие параметры функции.
- кластеризация: Выполните кластеризацию kmeans для точки выборки, установленной с помощью выбранных параметров объекта, получите метку каждой точки выборки и, наконец, нарисуйте в соответствии с разными метками.
Окончательный результат таков:
Конкретная реализация каждого этапа подробно описана ниже.
Сканировать данные
Единственное, что стоит отметить в этой части, это то, чтоPUBG.MEПри первом посещении вам будут отправлены некоторые файлы cookie:
cookie:__cfduid=d44db92eab1474bde64206da8c5e0f5b11507046474;
language=en-US;
cdmu=1508154346400;
cdmblk2=0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0;
cdmblk=0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0,0:0:0:0:0:0:0:0:0:0:0:0:0:0;
cdmtlk=0:0:0:0:0:0:0:0:0:0:0:0:0:0;
cdmgeo=us;
cdmbaserate=2.1;
cdmbaseraterow=1.1;
cdmint=0
И сервер будет проверять их каждый раз при следующем посещении, определив, что вы настоящий браузер (но не). в,__cfduidЗначение будет обновляться время от времени (около 10 минут?).
При написании краулером, если ваш запрос не содержит или содержит просроченный куки, сервер выкинет вам страницу с надписью "подождите 5 секунд блабла", естественно, ничего сканироваться не будет (Тан Шоу┑( ̄ Д  ̄)┍
анализировать
Просканированные данные могут быть организованы в виде двумерного массива 300*37 строк, где каждая точка выборки содержит 37 атрибутов, как показано на следующем рисунке:
Эти атрибуты:
['as solo Rating' 'Season High' 'Rank' 'Win Rate' 'Wins' 'Win Rank'
'Kill / Death Ratio' 'Kills' 'Kill Rank' 'Matches Played' 'Daily Logins'
'AVG Distance Travelled' 'Total Distance Travelled' 'AVG Distance On Foot'
'AVG Distance In Vehicle' 'Weapons Acquired' 'Vehicles Destroyed'
'Total Damage Dealt' 'Top 10 Rate' "Top 10's" 'AVG Survival Time'
'Longest Time Survived' 'Total Heals' 'Total Boosts' 'Team Kills'
'Suicides' 'Revives' 'AVG Damage Per Match' 'Most Kills In Match'
'Assists' 'KDA' 'Headshots' 'Headshot Kill Ratio' 'Longest Kill'
'Road Kills' 'Best Kill Streak' 'DBNO']
Разумно думать, что,Только средние данные имеют значение для сравнения. Глядя на средние данные, есть такие данные, как AVG Distance On Foot, AVG Distance In Vehicle и AVG Survival Time, которые описывают атрибуты игрока, отличные от меткой стрельбы (возможно, AVG Survival Time связан со меткой стрельбой?).На эти характеристики влияет стиль игрока., и не может хорошо описать плюсы и минусы уровня плеера и стоит ли использовать плагины, поэтому они не являются теми характерными параметрами, которые мы ищем.
Учитывая интуитивность и удобство визуализации, мы могли бы также выбрать 3 из этих 37 данных в качестве характеристических параметров. В итоге я выбрал Win Rate, KDA, Headshot Kill Ratio, потому что:
- Винрейт — это данные, которые лучше всего отражают уровень игрока, прямо в точку.
- KDA и коэффициент убийств при попадании в голову сильно коррелируют с меткостью игрока, а два данных подключаемых игроков (относящихся к самоприцеливанию) и обычных игроков, как правило, сильно различаются.
кластеризация
Учитывая 100 лучшихУровень обычного игрока не будет иметь большого значения, можно обоснованно оценить, что кластеризация 300 точек выборки на самом делеОтдельные обычные проигрыватели и подключаемые проигрыватели.
Давайте сначала посмотрим на распределение точек выборки:
Видно явно плотное скопление точек в области в левом нижнем углу.Можно считать, что нормальные игроки все в этом скоплении (посмотрите насколько ненормальны данные других точек, особенно правого верхнего угловой, 85% поедания курицы, 177КДА !!!177!!!)
Мы рассчитываем выбрать подходящий алгоритм кластеризации,Распределите обычных игроков и читы по разным классам. Поскольку плотность (визуальная проверка) обычного набора игроков и висячего набора сильно различается, алгоритм кластеризации на основе плотности, такой как DBSCAN, определенно не даст хороших результатов. Поэтому мы выбираем простейший алгоритм кластеризации на основе расстояния.kmeans.
Сначала предварительно сгруппируйте в 3 категории (поскольку в правом верхнем углу есть выброс, группировать 2 категории бесполезно...):
from sklearn.cluster import KMeans
from get_data import open_exl
m = open_exl('pubg_3.xls', 0)
kmeans = KMeans(n_clusters=3).fit(m)
labels = kmeans.labels_
Затем разделите его на разные цвета и нарисуйте:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
colors = ['#E4846C', '#19548E', '#E44B4E', '#197D7F', '#0282C9']
c_list = [colors[labels[i]] for i in range(m.shape[0])]
plt.figure(figsize=(12, 7))
ax1 = plt.subplot(111,projection='3d')
x,y,z = m[:,0],m[:,1],m[:,2]
ax1.scatter(x, y, z, s=15, color=c_list)
ax1.set_title('Data of PUBG without Labels')
ax1.set_zlabel('Headshot Kill Ratio')
ax1.set_ylabel('KDA')
ax1.set_xlabel('Win Rate')
plt.show()
Как показано на рисунке, оранжевая точка может рассматриваться как обычный игрок; красная меткость лучше, чем у обычного игрока, но процент побед такой же, как и у обычного игрока; в то время как меткость синей точки и процент побед явно лучше нормального плеера (особенно точка в правом верхнем углу... его id вроде бы это добавление определенной группы, чтобы что-то купить и повесить...)
Кроме того, из-за плотного распределения данных обычным игрокам нелегко различать определенные стили игры, ноМожно заметить, что поведение подключаемых плееров сильно отличается. Сначала оценим поведение плагина:
- Аимбот: Самоприцеливание, так же можно отличить силовая блокировка или просто самоприцеливание по сравнению КДА и скорости выстрела в голову (лень писать)
- Уоллер: Перспектива, ходят слухи, что некоторые стримеры не используют самонаводку, а используют двойные экраны, один из которых обычный, а другой для перспективы.
- Оба: Как следует из названия, это и перспектива, и самоцель.
- Ублюдок: Я действительно не знаю, как описать эту точку в правом верхнем углу.
Теперь мы собираем точки выборки по 5 категориям и смотрим, может ли алгоритм kmeans разделить весь набор точек на обычных игроков и четыре вышеуказанные категории, как я проанализировал:
from sklearn.cluster import KMeans
from get_data import open_exl
m = open_exl('pubg_3.xls', 0)
kmeans = KMeans(n_clusters=5).fit(m)
labels = kmeans.labels_
Рисунок:
Как показано на картинке выше, оранжевый - это, конечно, обычный игрок, красный можно рассматривать как самонаводящийся, небесно-голубой - перспективный, темно-синий - перспективный + самонаводящийся, зеленый в правом верхнем углу...эммм.. , черт возьми.
Добавьте метку, чтобы получить картинку в преамбуле:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
colors = ['#E4846C', '#19548E', '#E44B4E', '#197D7F', '#0282C9']
label_list = ['Normal', 'Both', 'Waller', 'Aimbot', 'MotherF**ker']
plt.figure(figsize=(19, 7))
ax = plt.subplot(122,projection='3d')
for i in range(5):
c = m[labels == i]
x,y,z = c[:,0],c[:,1],c[:,2]
ax.scatter(x, y, z, s=15, color=colors[i], label=label_list[i])
ax.legend()
ax.set_title('Data of PUBG with Labels Built by KMeans')
ax.set_zlabel('Headshot Kill Ratio')
ax.set_ylabel('KDA')
ax.set_xlabel('Win Rate')
ax1 = plt.subplot(121,projection='3d')
x,y,z = m[:,0],m[:,1],m[:,2]
ax1.scatter(x, y, z, s=15)
ax1.set_title('Data of PUBG without Labels')
ax1.set_zlabel('Headshot Kill Ratio')
ax1.set_ylabel('KDA')
ax1.set_xlabel('Win Rate')
plt.show()
дальнейший анализ
Оставь яму и напиши завтра┑( ̄Д  ̄)┍