数据:asina_football_data.csv
数据描述:
id :国家对应id
国家:国家名称
2019年国际排名:2019 年国际足联的世界排名。
2018年世界杯:2018 年世界杯中,很多球队没有进入到决赛圈,所以只有进入到决赛圈的球队才有实际的排名。如果是亚洲区预选赛 12 强的球队,排名会设置为 40。如果没有进入亚洲区预选赛 12 强,球队排名会设置为 50。
2015年亚洲杯:真实排名。
一、核心代码截图
导入实验中所需要的包
import matplotlib.pyplot as plt
from matplotlib import font_manager
from mpl_toolkits.mplot3d import Axes3D
import matplotlib
import pandas as pd
from sklearn import preprocessing
from sklearn.cluster import KMean
2.导入字体,用于3D图中显示中文汉字,字体可以自行在网上寻找ttf格式的字体。
my_font = font_manager.FontProperties( fname='时尚细黑字体.ttf' )
3.读取数据
# 读取数据
def read_data(filename):
return pd.read_csv( filename )
4.处理数据
# 处理数据
def deal_data(data):
return preprocessing.scale( data.iloc[:, 2:] )
5.训练模型
# 训练模型
def model_fit_pred(scale_x, data, k=3):
model = KMeans( k )
clf = model.fit( scale_x )
pre = clf.predict( scale_x ) # 预测模型
print( pre )
data = pd.concat( [data, pd.DataFrame( pre )], axis=1 )
data.rename( columns={0: "梯队"}, inplace=True ) # 修改列名
return data
画图 3D显示梯队
# 画图 3D显示梯队
def draw(data):
xs = data.iloc[:, 2]
ys = data.iloc[:, 3]
zs = data.iloc[:, 4]
fig = plt.figure()
ax = Axes3D( fig )
name = data.iloc[:, 1]
for label, x, y, z in zip( name, xs, ys, zs ):
ax.scatter( x, y, z )
ax.text( x, y, z, label, fontproperties=my_font )
cValue = ['r', 'y', 'g', 'b', 'r', 'y', 'g', 'b', 'r']
ax.set_xlabel( '2019年国际排名', fontproperties=my_font )
ax.set_ylabel( '2018年世界杯', fontproperties=my_font )
ax.set_zlabel( '2015年亚洲杯', fontproperties=my_font )
plt.show()
最后的主函数调用
if __name__ == '__main__':
data = read_data( "asina_football_data.csv" ) # 读取数据
print( data.head() )
scale_x = deal_data( data )
data = model_fit_pred( scale_x, data, 3 )
print( data.head() )
draw( data ) # 画出3D图
最终3D效果显示:
K-Means 的工作原理总结如下:
选取 K 个点作为初始的类中心点,这些点一般都是从数据集中随机抽取的;
将每个点分配到最近的类中心点,这样就形成了 K 个类,然后重新计算每个类的中心点;
重复第二步,直到类不发生变化,或者你也可以设置最大迭代次数,这样即使类中心点发生变化,但是只要达到最大迭代次数就会结束。
如何计算几个梯队的中心点呢,在做项目时常常会遇到这个事情,最简单的方式就是取平均值,然后根据新的中心点按照距离远近重新分配球队的分类,再根据球队的分类更新中心点的位置。
原文链接:https://blog.csdn.net/qq_41986239/article/details/106045507