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 pdimport numpy as npdf = 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 86df = df.fillna(df.mean())names = df.short_name.tolist() # saving names for laterdf = df.drop(['short_name'], axis = 1) # drop the short_name columndf.head()
复制代码


标准化数据


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


使用 PCA 将 60 列减少到 2 列


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


应用 DBSCAN


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


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


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


绘制 DBSCAN


import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlinesns.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 neighbornn = NearestNeighbors(n_neighbors = 2)# fit the nearest neighbornbrs = nn.fit(reduced)# returns two arrays - distance to the closest n_neighbors points and index for each pointdistances, indices = nbrs.kneighbors(reduced)# sort the distance and plot itdistances = np.sort(distances, axis=0)distances = distances[:,1]plt.plot(distances)
复制代码



寻找最佳 ε


使用新的 Eps 再次应用 DBSCAN


from sklearn.cluster import DBSCAN# train the model using DBSCANdb= DBSCAN(eps=0.3, min_samples=4)# prediction for dbscan clustersdb_clusters = db.fit_predict(reduced)reduced['cluster'] = db_clustersreduced['name'] = namesreduced.columns = ['x', 'y', 'cluster', 'name']reduced.head()
复制代码


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


import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlinesns.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:07456

评论

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

第 10 周 系统架构作业

心在那片海

第十周总结

孤星

TypeScript | 第七章:配置文件说明

梁龙先森

typescript 前端 编程语言 七日更

讲的真透彻!Android开发了解这些自然无惧面试,成功入职阿里

欢喜学安卓

android 程序员 面试 移动开发

Dubbo 微服务调用过程

梧桐

第八周-作业1

Mr_No爱学习

计算机专业必看!记录一次腾讯Android岗面试笔试总结,讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

架构师训练营第二期 Week 10 总结

bigxiang

极客大学架构师训练营

NO.002-Java并发编程之多核硬件架构

葛一凡

操作系统 设计原则 硬件架构

架构训练营第九周作业

一期一会

微服务 dubbo

架构师训练营第十四周课程笔记及心得

Airs

Spring 源码学习 10:prepareBeanFactory 和 postProcessBeanFactory

程序员小航

spring 源码 源码阅读

第五章学习总结

简简单单

第八周-学习总结

Mr_No爱学习

架构师技能图谱

天天向上

极客大学架构师训练营

第 10 周 系统架构总结

心在那片海

日本准备推行AI婚配,年轻人会为“爱情算法”买单吗?

脑极体

代理模式

soolaugust

设计模式 代理模式 七日更

Code Review实践

HQ数字卡

Code Review 七日更

训练营第十周总结

大脸猫

极客大学架构师训练营

第五周 技术选型作业

简简单单

wildfly 21中应用程序的部署

程序那些事

程序那些事 wildfly wildfly21 应用程序部署 应用程序配置

架构师训练营第二期 Week 10 作业

bigxiang

极客大学架构师训练营

冰河是谁?到底是干嘛的?

冰河

程序员 程序人生 架构师 冰河 冰河技术

工具词典:数据

lidaobing

数据 28天写作营

第十周作业

孤星

第 10 周作业

Steven

行业寒冬:程序员怎样优雅度过35岁中年危机?跳槽薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

通达快递产品架构设计

天天向上

极客大学架构师训练营

提问开启创新-激发团队创新的提问法

Alan

个人成长 创新 团队文化 28天写作营 七日更

训练营第十周作业

大脸猫

极客大学架构师训练营

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