问题描述
在篮球运动中,一般情况下,控球后卫与得分后卫的助攻数较多,小前锋的得分数较多,而大前锋与中锋的助攻数与得分数较少。表中所示为21名篮球运动员每分钟助攻数和每分钟得分数的数据集,请运用K-Means聚类算法将这21名篮球运动员划分5类,并画图判断他们分别属于什么位置。数据文件下载
assists_per_minute | points_per_minute | |
---|---|---|
1 | 0.0888 | 0.5885 |
2 | 0.1399 | 0.8291 |
3 | 0.0747 | 0.4974 |
4 | 0.0983 | 0.5772 |
5 | 0.1276 | 0.5703 |
6 | 0.1671 | 0.5835 |
7 | 0.1906 | 0.5276 |
8 | 0.1061 | 0.5523 |
9 | 0.2446 | 0.4007 |
10 | 0.167 | 0.477 |
11 | 0.2485 | 0.4313 |
12 | 0.1227 | 0.4909 |
13 | 0.124 | 0.5668 |
14 | 0.1461 | 0.5113 |
15 | 0.2315 | 0.5113 |
16 | 0.0494 | 0.559 |
17 | 0.1107 | 0.4799 |
18 | 0.2521 | 0.5735 |
19 | 0.1007 | 0.6318 |
20 | 0.1067 | 0.4326 |
21 | 0.1956 | 0.428 |
代码实现
问题分析
- 源数据展示
data
- 数据切割,得到第2列至第3列以及所有行的数据
data.iloc[:,1:]
- 进行K-means聚类以及数据预测
clf = KMeans(n_clusters=5) #表示输出将数据集分成类簇数为5的聚类
#输出聚类预测结果,对X聚类,20行数据,每个y_pred对应X的一行或一个孩子,聚成3类,类标为0、1、2
y_pred = clf.fit_predict(X)
print(y_pred) #输出结果
- 对聚类的预测结果画出散点图
plt.scatter(x, y, c=y_pred, marker='o')
plt.title("Kmeans-Basketball Data") #表示图形的标题为Kmeans-heightweight Data
plt.xlabel("assists_per_minute") #表示图形x轴的标题
plt.ylabel("points_per_minute") #表示图形y轴的标题
plt.legend(["Rank"]) #设置右上角图例
plt.show() #显示图形
完整代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 读取数据
data = pd.read_csv("data.csv")
X = data.iloc[:,1:]
print(X)
#K-means聚类
clf = KMeans(n_clusters=5) #表示输出将数据集分成类簇数为5的聚类
#输出聚类预测结果,对X聚类,20行数据,每个y_pred对应X的一行或一个孩子,聚成3类,类标为0、1、2
y_pred = clf.fit_predict(X)
print(y_pred) #输出结果
x = X.iloc[:,0] #获取第1列的值
print(x)
y = X.iloc[:,1] #获取第2列的值
print(y)
# 可视化操作
#绘制散点图(scatter),横轴为x,获取的第1列数据;纵轴为y,获取的第2列数据;
#c=y_pred对聚类的预测结果画出散点图,marker='o'说明用点表示图形
plt.scatter(x, y, c=y_pred, marker='o')
plt.title("Kmeans-Basketball Data") #表示图形的标题为Kmeans-heightweight Data
plt.xlabel("assists_per_minute") #表示图形x轴的标题
plt.ylabel("points_per_minute") #表示图形y轴的标题
plt.legend(["Rank"]) #设置右上角图例
plt.show() #显示图形