这一节将使用k-平均聚类方法根据篮球运动员的行为数据对运动员进行聚类,这样的聚类结果在与球队有关的各项工作中都具有参考价值。例如,可根据聚类结果判断球员风格,从而更好地进行上场球员的调配;引进新球员时可根据聚类结果挑选更适合球队的球员,弥补球队短板,避免球员同质化;球员还可参考聚类结果进行有针对性的训练等。本案例所用数据是2013-2014赛季NBA控球后卫的赛场行为数据,并已经过适当地处理(去除噪声和无效数据),数据可从教材资源平台下载。
首先导入需要使用的Python库。其中pandas提供了高效易用的数据分析工具,numpy是适用于科学计算的库,两者经常配合使用。matplotlib是Python中常用的绘图系统,用来做数据可视化非常方便。
In[1]:importpandasaspd
In[2]:
In[3]:importnumpyasnp
读入所需的数据,显示数据的前5行,可以看到数据包含33个数据项,其中包括球员姓名、在球队中所打的位置、年龄、赛季等。具体地,pos代表球员在球场上所打的位置,g代表本赛季参赛场数,pts代表总得分,ast代表助攻次数,tov代表失误次数,ppg=pts/g代表平均得分(PointsPerGame),atr=ast/tov表示助攻失误比(AssistTurnoverRatio)。为了简单起见,在此案例中只使用其中的数据项ppg和atr进行聚类,感兴趣的同学可以探索使用更多的数据项进行分析。
In[4]:nba=pd.read_csv('nba_2013.csv')
In[5]:()
Out[5]:
playerposage...season_endppgatr
0D.J.AugustinPG26...201313.0985922.504000
1LeandroBarbosaPG31...20137.5000001.684211
2JoseBareaPG29...20138.3544302.424000
3JerrydBaylessPG25...20139.2500002.365854
4SteveBlakePG33...20136.8727273.009804
[5rowsx33columns]
使用matplotlib可以画出相应数据的散点图(图5-5)。
图5-5
第一步,设置聚类的个数为5,并且随机选取5个点作为初始种子,初始的种子在图中用红色标出(图5-6)。
In[6]:cluster_num=5
In[7]:random_initial=(,size=clus
ter_num)
In[8]:centroids=[random_initial]
图5-6
第二步,将每个元素分配给距离其最近的中心,生成5个簇。
第三步,重新计算每个簇的中心。因为这两个步骤是需要反复迭代的,为了代码的易用性,下面先以函数的形式定义好这两个步骤要实现的功能,然后在迭代过程中就可以通过反复调用这些函数来完成相应的工作了。
首先定义一个函数,以字典的形式存储中心,字典键值是每个簇的名称,字典的值是对应中心的坐标。
In[10]:defcentroids_to_dict(centroids):
dictionary={}
counter=0
forindex,():
coordinates=[row['ppg'],row['atr']
dictionary[counter]=coordinates
counter+=1
returndictionary
再定义用来计算点到中心欧式距离的函数。这里导入了用于数学计算的math库。
In[11]:importmath