用k-means对亚洲足球队做聚类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013317445/article/details/87893853

背景知识

亚足联AFC:
1954年成立,总部马来西亚吉隆坡。
负责管理亚洲区足球事务,举办各项国家级及俱乐部级赛事,协助国际足联举行世界杯预选赛及4年一度的亚洲杯。
47个成员协会,包括阿富汗、缅甸、中国台北、中国香港、印度尼西亚、日本、韩国、巴基斯坦、菲律宾、新加坡、越南等。
分为两大势力——东亚及西亚,东亚包括有日本、韩国、中国、澳大利亚(来自大洋洲的澳大利亚于2006年加入亚足联),西亚有伊拉克、沙特阿拉伯、阿联酋等。

2018俄罗斯世界杯:
5大洲足联的32支球队参赛
东道主俄罗斯自动获得参赛资格
其余31支通过各大洲足联举办的预选赛事获得参赛资格(如,亚足联举办的亚洲区预选赛)

2018世界杯亚洲区预选赛:
预选赛12强赛,分两组,两组前两名直接晋级世界杯决赛,两组第3名之间的胜者获得附加赛资格。

数据

2019年国际足联的世界排名+2015年亚洲杯排名+2018俄罗斯世界杯排名(只有进入决赛的亚足联国家才有实际排名)
我这里选了20支球队

import pandas as pd
data= pd.read_csv(r"G:\case\data\footballRank.csv")
data.head()
国家 2019国际排名 2018世界杯 2015亚洲杯
0 中国 73 40 7
1 日本 60 15 5
2 韩国 61 19 2
3 伊朗 34 18 6
4 沙特 67 26 10

思路

要用k-means模型,k-means是用距离做相似性度量的,先要做数据标准化,消除不同量纲级别带来的影响,使各维度上的量纲等价。

1、数据标准化
2、建模,用k-means做聚类

创建k-means模型:
KMeans(n_clusters=8, init=‘k-means++’, n_init= 10, max_iter=300, tol=0.0001, precompute_distances=‘auto’, verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm=‘auto’)
n_clusters: 即k值,一般需要多试一些k值。可以随机设置一些k值,选聚类效果最好的。
init: 初始值(初始中心点)选择的方式,默认是采用优化过的k-means++方式。也可以自己指定中心点,或者采用random完全随机的方式,一般推荐用优化过的k-means++方式。自己设置一般是对于个性化的数据进行设置,很少采用。
n_init: 初始化中心点的运算次数,默认是10。模型是否能快速收敛和中心点的选择关系非常大,所以在选中心点上多花一些时间,来争取整体时间上的快速收敛是值得的。每一次中心点是随机生成的,所以要多运行几次,选择最好的做初始中心点。k值比较大,可以适当增大n_init值。
max_iter: 最大迭代次数。如果聚类很难收敛的话,设置max_iter可以确保结束长时间运行。
algorithm: k-means的实现算法,三种取值:“auto”、“full”、“elkan”。推荐采用默认的“auto”。'full’采用传统的K-Means算法,‘auto会根据数据的特点自动选择full还是elkan。

fit(data)可以对data做聚类,predict(data)可以对每一个样本,计算最近的类

实验

1、Z-score标准化

k-means用距离度量相似度,需要做数据规范化,我采用了其中的标准化方法:Z-score。用来消除不同量纲级别带来的误差。

import numpy as np
from sklearn import preprocessing
train_x=data[['2019国际排名','2018世界杯', '2015亚洲杯']]
scaled_x= preprocessing.scale(train_x)
d:\python27\lib\site-packages\ipykernel_launcher.py:1: DataConversionWarning: Data with input dtype int64 were all converted to float64 by the scale function.
  """Entry point for launching an IPython kernel.
scaled_x
array([[-0.5842676 ,  0.05223517, -0.64677721],
       [-0.97679881, -2.12423024, -1.03291285],
       [-0.9466041 , -1.77599577, -1.61211632],
       [-1.76186121, -1.86305439, -0.83984503],
       [-0.76543585, -1.16658546, -0.06757374],
       [-0.04076286,  0.05223517, -1.22598067],
       [ 0.26118422,  0.05223517,  0.51162973],
       [-0.34270994,  0.05223517, -0.83984503],
       [-0.13134698,  0.05223517, -0.45370938],
       [ 0.89527309,  0.05223517,  1.28390102],
       [ 0.29137893,  0.92282133,  1.28390102],
       [-0.16154169,  0.92282133,  0.31856191],
       [ 0.71410485,  0.92282133,  0.12549408],
       [ 0.5329366 ,  0.92282133,  0.70469755],
       [ 2.16345083,  0.92282133,  1.28390102],
       [-1.58069297, -0.81835099, -1.80518414],
       [-0.49368348,  0.05223517,  1.28390102],
       [ 0.77449426,  0.92282133, -0.26064156],
       [ 2.042672  ,  0.92282133,  0.89776537],
       [ 0.11021068,  0.92282133,  1.0908332 ]])

2、k-means做聚类

from sklearn.cluster import KMeans

K值选几呢?
选3,将亚洲足球划分为3个梯队

k=3
model= KMeans(n_clusters= k, init='k-means++', n_init=10, max_iter= 300)
clf= model.fit(scaled_x)
pre_y= clf.predict(scaled_x)
#concat合并
result= pd.concat([data, pd.DataFrame(pre_y)], axis=1)
result
国家 2019国际排名 2018世界杯 2015亚洲杯 0
0 中国 73 40 7 1
1 日本 60 15 5 2
2 韩国 61 19 2 2
3 伊朗 34 18 6 2
4 沙特 67 26 10 2
5 伊拉克 91 40 4 1
6 卡塔尔 101 40 13 0
7 阿联酋 81 40 6 1
8 乌兹别克斯坦 88 40 8 1
9 泰国 122 40 17 0
10 越南 102 50 17 0
11 阿曼 87 50 12 0
12 巴林 116 50 11 0
13 朝鲜 110 50 14 0
14 印尼 164 50 17 0
15 澳洲 40 30 1 2
16 叙利亚 76 40 17 0
17 约旦 118 50 9 0
18 科威特 160 50 15 0
19 巴勒斯坦 96 50 16 0

根据聚类结果可以看到:
日本、韩国、伊朗、沙特、澳洲为一梯队
中国、伊拉克、阿联酋、乌兹别克斯坦为一梯队
卡塔尔、泰国、越南、阿曼、巴林、朝鲜、印尼、叙利亚、约旦、科威特、巴勒斯坦为一梯队

猜你喜欢

转载自blog.csdn.net/u013317445/article/details/87893853