初识 python - KMeans 简单聚类(二)

尽管老师教的这个 KMeans 聚类的使用太浅显了,但还是笔记做全吧,说不准在哪能用到。上一篇是对客户的一些数据进行了简单的聚类分析,这一篇关于聚类的使用和前面差不多一样,还是那几行,不过是换了个例子。 

初识 python - KMeans 简单聚类(二)_第1张图片

对这个网页的球员数据进行聚类,根据数据将其位置分为三类:后卫,中锋,前锋(我对篮球机制不是很熟悉,更搞不懂这次的划分。。)

这次写的代码是比较系统,里面的知识点基本在前面也都说过了,像数据爬取,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 算法的入门?就结束了,深入的学习等以后有时间了再继续。

 

你可能感兴趣的:(Python)