在 FIFA 20 將技能相似球員進行分組(2):層次聚類

理解層次聚類

  • 與 K-均值聚類算法(K-means)不同,不需要指定聚類的數量。
  • 結果彙總在樹狀圖,樹狀圖可以方便地解釋數據和選擇任何數量的聚類。

基本思路

  • 專注 :自下而上(又稱凝聚聚類(Agglomerative clustering))
  • 從單個觀察開始(又稱 葉子 )開始,作爲聚類。
  • 通過將葉子合併成 樹枝 向上移動。
  • 將樹枝與其他葉子或樹枝合併。
  • 最終,當所有的東西都合併到一個聚類時,到達頂端。

樹狀圖示例。

解釋樹狀圖

  • 在適當的高度上進行切割,以獲得所需聚類的#。
  • 垂直軸:相異度度量(或距離)——兩個聚類合併的高度。
  • 高度表示聚類的相似性。
  • 較低的高度更相似
  • 水平軸並不表示相似性。
  • 交換左右分支並不影響樹狀圖的意義。

它如何衡量聚類之間的差異?

  1. 基於度量(最常見的是曼哈頓距離(Manhattan distance)或歐幾里得距離(Euclidean distance,亦稱歐氏距離))。
    • 最長距離法(Complete linkage)(即最遠鄰法(furthest-neighbor))
    • 最短距離法(Single linkage)(即最近鄰法(nearest-neighbor))
    • 平均距離法(Average linkage)
    • 質心距離法(Centroid linkage)
      2, 基於相關性的距離
    • 查找觀測值之間的相關性。

層次聚類的缺點

  1. 計算成本高——不適用於大數據集。
    • $O(N²{log}N)$,而$O(N)$表示 K-均值。
  2. 對噪聲和離羣值敏感。

使用層次聚類對 FIFA20 的球員進行分組

數據清理/預處理(第一部分中的代碼)

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)

基於平均距離法的層次聚類

import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as sch
# plot dendrogram using average linkage
plt.figure(figsize=(10,14))
plt.title('Hierarchical Clustering Dendrogram with Average Linkage')
dendrogram = sch.dendrogram(sch.linkage(X_norm, method="average"), labels= names, leaf_font_size = 13, orientation='right')

  • 分成兩組:守門員和其他人

最短距離法

# plot dendrogram using single linkage
plt.figure(figsize=(10,14))
plt.title('Hierarchical Clustering Dendrogram with Single Linkage')
dendrogram = sch.dendrogram(sch.linkage(X_norm, method="single"), labels= names, leaf_font_size = 13, orientation='right')

分爲守門員和其他人

質心距離法

# plot dendrogram using centroid linkage
plt.figure(figsize=(10,14))
plt.title('Hierarchical Clustering Dendrogram with Centroid Linkage')
dendrogram = sch.dendrogram(sch.linkage(X_norm, method="centroid"), labels= names, leaf_font_size = 13, orientation='right')

  • 再次分成守門員和其他人。

最長距離法

# plot dendrogram using complete linkage
plt.figure(figsize=(10,14))
plt.title('Hierarchical Clustering Dendrogram with Complete Linkage')
dendrogram = sch.dendrogram(sch.linkage(X_norm, method="complete"), labels= names, leaf_font_size = 13, orientation='right')

結論

最長距離法似乎是將球員進行最準確地分組的方法!

感謝閱讀本文,希望對你有所啓迪。

本文的 GitHub 倉庫:https://github.com/importdata/Clustering-FIFA-20-Players

作者介紹

Jaemin Lee,Jaemin Lee,專攻數據分析與數據科學,數據科學應屆畢業生。

原文鏈接

https://towardsdatascience.com/grouping-soccer-players-with-similar-skillsets-in-fifa-20-part-2-hierarchical-clustering-839705f6d37d?source=---------0-----------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章