尽管老师教的这个 KMeans 聚类的使用太浅显了,但还是笔记做全吧,说不准在哪能用到。上一篇是对客户的一些数据进行了简单的聚类分析,这一篇关于聚类的使用和前面差不多一样,还是那几行,不过是换了个例子。
对这个网页的球员数据进行聚类,根据数据将其位置分为三类:后卫,中锋,前锋(我对篮球机制不是很熟悉,更搞不懂这次的划分。。)
这次写的代码是比较系统,里面的知识点基本在前面也都说过了,像数据爬取,xpath,文件保存与读取,可视化等这些,唯一新的知识就是 csv 文件的保存 ,这个在里面也容易理解(但当时找方向的时候找了老久,最后保存成功发现也就那么几行代码),下面我直接放上完整的代码:
import requests
from lxml import etree
import csv
#1.数据采集
def get_data(url):
response = requests.get(url)
text = response.content.decode('utf-8')
#生成结点树
tree = etree.HTML(text)
tr_list = tree.xpath('//tbody/tr') #拿到tr中每一行的数据
# 添加 csv 文件的文件头
csv_header = ['球员姓名', '得分', '助攻', '上场时间']
with open('nba.csv', 'a', encoding='utf-8', errors='ignore', newline='') as fp:
w = csv.writer(fp)
w.writerow(csv_header)
for tr in tr_list:
#球员姓名
name = tr.xpath('./td[2]/a/text()')
#得分
score = tr.xpath('./td[last()-2]/text()')
#助攻
help = tr.xpath('./td[last()-7]/text()')
#时间
t = tr.xpath('./td[5]/text()')
#生成每一位球员数据,数据之间用逗号分隔
item = name[0]+','+score[0]+','+help[0]+','+t[0]+'\n'
#保存数据--csv
with open('nba.csv','a',encoding='utf-8',errors='ignore',newline='') as fp:
w = csv.writer(fp)
w.writerow([name[0],score[0],help[0],t[0]])
fp.close()
print(item)
#2.数据分析
import pandas as pd
# python 中大多数机器学习算法都不需要手动写,在 sklearn 库中都已经包含
from sklearn.cluster import KMeans
#2.数据分析
def dluster4NBA():
# 一、读取数据
data = pd.read_csv('nba.csv', encoding='utf-8')
print(data)
mat = data.as_matrix() # 数据->矩阵
# 返回一个二元数组,每一条数据就是一个数组
# print(type(mat))
# print(mat)
# 二、创建聚类对象
inX = mat[:,1:] #暂时剔除球员名字
# print(inX)
kms = KMeans(n_clusters=3) # 分为三类
result = kms.fit_predict(inX)
print('聚类后的结果:', result)
# 聚类后的结果: [1 1 1 1 1 2 1 2 0 1 0 2 2 2 2 0 2 2 2 0]
# 三、可视化——由于聚类后的数据比较抽象,所以将数据进行可视化后再分析
import matplotlib.pyplot as plt
# 1)、创建画布
plt.figure()
# 属性设置
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.xlabel('球员')
plt.ylabel('球员得分水平')
# 2)、进行绘制
# 逐个点(人)数据分析
for i in range(len(result)):
x = data.iloc[i, 0]
# print(x)
y = round((data.iloc[i, 1]+data.iloc[i, 2])/data.iloc[i, 3],3) #将得到的结果保留三位小数
# print(y)
print('第%d个人,球员:' % i, x,'得分水平:',y)
# 绘制
if result[i] == 0:
plt.plot(x, y, '*r')
pass
elif result[i] == 1:
plt.plot(x, y, '*b')
pass
else:
plt.plot(x, y, '*k')
# plt.plot(x,y,'*','r')
# 3)、显示
plt.show()
pass
if __name__ == '__main__':
url = 'http://www.stat-nba.com/query.php?QueryType=all&AllType=season&AT=avg&order=1&crtcol=pts&PageNum=20'
#获取NBA球员数据
get_data(url)
#进行聚类分析
dluster4NBA()
里面我写的时候基本上都有备注,很容易理解,另外这次聚类可视化后的图更加让我迷惑(???),索性就不放了。
到这里,算是 KMeans 算法的入门?就结束了,深入的学习等以后有时间了再继续。