FIFA20 对技能相近的球员分组(3):DBSCAN

2020 年 9 月 23 日

FIFA20 对技能相近的球员分组(3):DBSCAN

了解 DBSCAN

  • 基于密度的噪声应用空间聚类。
  • 基于密度的聚类定位高密度区域,这些高密度区域被低密度区域彼此分开。
  • 密度:指定半径内的点数(又名 Eps 或 ε)。

点数

  • 核心点 :如果一个点在 Eps 中有超过指定数量的点(MinPts)。、
  • 边界点 :它在 EPS 中少于 MinPts,但在核心点附近。
  • 噪音点(离群值) :不是核心点或边界点的任何点。

核心点、边界点、离群值示例。

集群如何形成?

  1. 选择一个点 P。
  2. 从 p.w.t. eps 和 MinPts 中检索密度可达的所有点。
  • 如果 p 是核心点,则形成一个聚类。
  • 如果 p 是边界点,则从 p 没有密度可达的点,并且 DBSCAN 将访问数据库的下一个点。
  1. 继续执行该过程,直至所有点都已处理完毕。
  2. 结果与点的处理顺序无关。

ε- 邻域概念

  • 从对象到 ε 半径内的对象。
  • 和新对象:一个对象的 ε- 邻域 至少包含 MinPts 个 对象。

p 为和新对象

可达性

  • 直接密度可达 :如果 q 在 p 的 ε- 邻域内,且 p 为核心点,则点 q 是从 p 直接密度可达的。

  • 密度可达 :如果点 p 在点 q 的 ε 距离内,且点 q 在其邻近点的可达距离 ε 内有足够数量的点,则称点 p 是从点 q 密度可达。

连接性

  • 密度连接性 :如果存在点 r,使得点 p 和点 q 可以从 r 的 w.r.t. ε 和 MinPts 密度可达,则点 p 密度连接到点 q。

q 通过 r 密度连接到 p

优缺点及应用

优点 缺点 应用
对离群值检测的健壮性 对 eps 和 MinPts 敏感 卫星图像
最适合分离高密度的聚类与低密度的聚类 若数据集过于稀疏,则不合适 异常检测

使用 DBSCAN 对 FIFA 20 球员进行分组

数据清理 / 预处理(第一部分和第二部分的代码)

复制代码
import pandas as pd
import numpy as np
df = pd.read_csv("/content/players_20.csv")
df = df[['short_name','age', 'height_cm', 'weight_kg', 'overall', 'potential','value_eur', 'wage_eur', 'international_reputation', 'weak_foot','skill_moves', 'release_clause_eur', 'team_jersey_number','contract_valid_until', 'nation_jersey_number', 'pace', 'shooting','passing', 'dribbling', 'defending', 'physic', 'gk_diving','gk_handling', 'gk_kicking', 'gk_reflexes', 'gk_speed','gk_positioning', 'attacking_crossing','attacking_finishing','attacking_heading_accuracy', 'attacking_short_passing','attacking_volleys', 'skill_dribbling', 'skill_curve','skill_fk_accuracy', 'skill_long_passing','skill_ball_control','movement_acceleration', 'movement_sprint_speed', 'movement_agility','movement_reactions', 'movement_balance', 'power_shot_power','power_jumping', 'power_stamina', 'power_strength', 'power_long_shots','mentality_aggression', 'mentality_interceptions','mentality_positioning', 'mentality_vision', 'mentality_penalties','mentality_composure', 'defending_marking', 'defending_standing_tackle','defending_sliding_tackle', 'goalkeeping_diving','goalkeeping_handling', 'goalkeeping_kicking','goalkeeping_positioning', 'goalkeeping_reflexes']]
df = df[df.overall > 86] # extracting players with overall above 86
df = df.fillna(df.mean())
names = df.short_name.tolist() # saving names for later
df = df.drop(['short_name'], axis = 1) # drop the short_name column
df.head()

标准化数据

复制代码
from sklearn import preprocessing
x = df.values # numpy array
scaler = preprocessing.MinMaxScaler()
x_scaled = scaler.fit_transform(x)
X_norm = pd.DataFrame(x_scaled)

使用 PCA 将 60 列减少到 2 列

复制代码
from sklearn.decomposition import PCA
pca = PCA(n_components = 2) # 2D PCA for the plot
reduced = pd.DataFrame(pca.fit_transform(X_norm))

应用 DBSCAN

复制代码
from sklearn.cluster import DBSCAN
# train the model using DBSCAN
db = DBSCAN(eps=1, min_samples=5)
# the prediction for dbscan clusters
db_clusters = db.fit_predict(reduced)

通过添加球员名字和他们的聚类来创建新的数据帧

复制代码
reduced['cluster'] = db_clusters
reduced['name'] = names
reduced.columns = ['x', 'y', 'cluster', 'name']
reduced.head()

绘制 DBSCAN

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(style="white")
ax = sns.lmplot(x="x", y="y", hue='cluster', data = reduced, legend=False,fit_reg=False, size = 10, scatter_kws={"s": 250})
texts = []
for x, y, s in zip(reduced.x, reduced.y, reduced.name):
    texts.append(plt.text(x, y, s))

ax.set(ylim=(-2, 2))
plt.tick_params(labelsize=15)
plt.xlabel("PC 1", fontsize = 20)
plt.ylabel("PC 2", fontsize = 20)
plt.show()

DBSCAN,Eps=1,MinPts=5

  • 聚类形成为守门员和其他球员
  • 不是很准确

寻找最佳 ε

  • 通过计算每个点到最近的 n 个点的距离,对结果进行排序和绘制,找出最佳 ε。
from sklearn.neighbors import NearestNeighbors
# calculate the distance from each point to its closest neighbor
nn = NearestNeighbors(n_neighbors = 2)
# fit the nearest neighbor
nbrs = nn.fit(reduced)
# returns two arrays - distance to the closest n_neighbors points and index for each point
distances, indices = nbrs.kneighbors(reduced)
# sort the distance and plot it
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.plot(distances)

寻找最佳 ε

使用新的 Eps 再次应用 DBSCAN

from sklearn.cluster import DBSCAN
# train the model using DBSCAN
db= DBSCAN(eps=0.3, min_samples=4)
# prediction for dbscan clusters
db_clusters = db.fit_predict(reduced)
reduced['cluster'] = db_clusters
reduced['name'] = names
reduced.columns = ['x', 'y', 'cluster', 'name']
reduced.head()

以新的 Eps=0.3 和 MinPts=4 再次绘制

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(style="white")
ax = sns.lmplot(x="x", y="y", hue='cluster', data = reduced, legend=False,fit_reg=False, size = 9, scatter_kws={"s": 250})
texts = []
for x, y, s in zip(reduced.x, reduced.y, reduced.name):
    texts.append(plt.text(x, y, s))

ax.set(ylim=(-2, 2))
plt.tick_params(labelsize=10)
plt.xlabel("PC 1", fontsize = 20)
plt.ylabel("PC 2", fontsize = 20)
plt.show()

Eps=0.3,MinPts=4 的 DBSCAN 图

结论

使用 Eps=0.3 和 MinPts=4 的 DBSCAN 在分组和检测离群值方面做得更好!

感谢阅读本文,希望对您有所帮助!

GitHub Repo: https://github.com/importdata/Clustering-FIFA-20-Players

作者介绍

Jaemin Lee,专攻数据分析与数据科学,数据科学应届毕业生。

原文链接

https://towardsdatascience.com/grouping-soccer-players-with-similar-skillsets-in-fifa-20-part-3-dbscan-b23389a08cc7

2020 年 9 月 23 日 14:07 398

评论

发布
暂无评论
发现更多内容

架构师训练营第三周总结

一剑

探究逻辑思维,姚华兴电影读《金字塔原理》提升自我

Geek_116789

组合模式打印窗口组件的树结构

奈学教育<P7架构师>课程大纲(第一阶段)

古月木易

极客大学架构师训练营

CDN百科第五讲 | CDN和游戏加速器有什么区别?

巨侠说

CDN

我在星巴克买了张卡,意外发现一亿客户信息泄露

田晓旭

如何将100个Pod挂载卷的时间缩短10倍?

XSKY融合存储

作业

Mr.Monkey

架构师训练营第三周 - 作业

Lost Horizon

极客大学架构师训练营

架构师训练营--第三周学习总结

花花大脸猫

极客大学架构师训练营

第三周作业

changtai

极客大学架构师训练营

游戏夜读 | 你的名字记在那里

game1night

组合模式设计窗口组件

缺省模式

操作 Docker 容器 | Docker 系列

AlwaysBeta

Docker 容器

架构师训练营--第三周作业

花花大脸猫

极客大学架构师训练营

2020年6月23日 创建高性能的索引

瑞克与莫迪

架构师训练营第三周感悟

张锐

招谁惹谁了

池建强

写作 分享

利用组合设计模式编写一个界面打印

elfkingw

极客大学架构师训练营

架构师培训 -03 设计模式

刘敏

架构师训练营第三周作业

Linuxer

极客大学架构师训练营

大庆金桥:基于 SpreadJS 开发实现计量器具检定证书的在线生成与打印

Geek_Willie

SpreadJS 计量器具检定 检定证书

【漫画】最近,老王又Get了CDN的新技能

巨侠说

CDN

架构师训练营 - 第3周学习总结

水边

极客大学架构师训练营

厦门科云:构建基于 SpreadJS 的管理会计综合实训平台

Geek_Willie

SpreadJS 管理会计综合实训平台

学习总结

Mr.Monkey

作业

GalaxyCreater

作业

爆料一下:我的读书之道

非著名程序员

读书笔记 程序员 程序人生 读书 读书感悟

ARTS-week4

王钰淇

ARTS 打卡计划

奈学教育<P7架构师>课程大纲(第一阶段)

奈学教育

极客大学架构师训练营

架构师训练营 - 命题作业 第3周

水边

极客大学架构师训练营

13.9k Star, 3.6k Fork,技术人如何从0到1打造成功的开源软件

13.9k Star, 3.6k Fork,技术人如何从0到1打造成功的开源软件

FIFA20 对技能相近的球员分组(3):DBSCAN-InfoQ