本内容所有代码都在我的github上,喜欢的朋友可以点个赞
https://github.com/zxhjames/NBA_DataAnalysis

由于一些小需求,需要学习下聚类算法,大二有段时间曾因为比赛学习过聚类,当时还看了好几遍吴恩达老师的视频,真心不错

但时至今日,知识尽数忘却,故重新拾起,本篇文章将结合一个简单的例子,简单总结下聚类基础的知识以及如何快速使用

学聚类算法时,我会问自己,聚类算法解决了什么问题?他和分类算法有什么区别,它有什么实际的应用

物以类聚,人以群分,世间万物都有相似的特征,人格特征,情感特征,形象特征等等,一张图片有很多个像素,我想要保持图片清晰度良好的情况下尽量减小图片的size,从而减少存储与通信消耗,便可以通过聚类去缩减像素,这就是图片压缩

我喜欢看nba,今天就集合nba2013-2014赛季中部分球员的数据,来用聚类算法进行研究学习,数据在文末可下载

我们还是使用pandas对数据进行一些预处理

import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
nba = pd.read_csv("nba_2013.csv",encoding='utf-8')
nba.head(3)

我们只看有价值的数据,在预处理之前,有必要梳理下下聚类算法的理论基础,聚类算法也分很多种:层次法,划分法,密度法等等

由于聚类是一种无监督的机器学习算法,也就是说,算法的初始化并不是人为控制的,这会对结果产生影响,这也是其与分类最大的区别,分类的输入是认为可控的,我们只需要定义好分类的类别,然后输入数据得出算法计算出的结果即可,而聚类则需要在不断学习重复的过程中发掘最优解的,他并没有先验知识的输入。主流的基于划分的方法,简单理解就是,想象你有一堆散点需要聚类,想要的聚类效果就是“类内的点都足够近,类间的点都足够远”。首先你要确定这堆散点最后聚成几类,然后挑选几个点作为初始中心点,再然后依据预先定好的启发式算法给数据点做迭代重置,直到最后到达“类内的点都足够近,类间的点都足够远”的目标效果。也正是根据所谓的“启发式算法”,形成了k-means算法及其变体包括kmedoids、kmodes、kmedians、kmeans等算法。先来看下最简单的一个划分类算法,KMeans

KMeans算法理解起来非常简单,算法步骤主要分为以下几步

  • 随机地选择k个对象,每个对象初始地代表了一个簇的中心

  • 对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇

  • 重新计算每个簇的平均值,更新为新的簇中心

  • 不断重复2、3,直到准则函数收敛

由于数据集的特征较多,如果全部都拿来用,必然是维度爆炸,喜欢看球的朋友都知道,评估一个nba球员的综合能力,大多数是看场均得分,细分之外,如果是控卫,会看重他的助攻失误比,如果是后卫和前锋,还会看重投篮命中率等综合素质,如果是中锋,那不用说,肯定是篮板球,其实打过2k系列游戏的朋友都知道,一些模式下,比赛还会计算球员的正负效率值,这些计算方式都比较专业,再次不再赘述

添加主特征

# 提取出所有控卫的信息
nba['场均得分'] = nba['赛季总得分'] / nba['出场数']
nba['场均出场时间'] = nba['出场时间'] / nba['出场数']
nba['场均失误'] = nba['总失误'] / nba['出场数']

拷贝出主要特征数据集,并检测一下有没有异常值

# 拷贝一份原始数据
dataset = nba[['姓名','位置','年龄','场均得分','场均出场时间','场均失误']]
print(dataset)

dataset.shape
# 显示数据的规格
dataset.info()
# 去除空值
dataset.isnull().sum()

很好的数据集,没有异常值,如果有的话(类似NAN这种)需要用fillna填充

在这里不需要用出场数和首发数的原因是,nba球员往往会因为伤病,违规,或者是篮协原因而影响出场数目,这个指标我们不能考虑

从中选出三个维度的特征,并进行标准化

newdataset = dataset[['场均得分','场均出场时间','场均失误']]
newdataset
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler_df = scaler.fit_transform(newdataset)

看一下立体的分布图

ax = plt.subplot(111,projection='3d')
plt.scatter(X[:,0], X[:,1],X[:,2] ,c='y')
ax.set_zlabel('error/g')
ax.set_ylabel('time/g')
ax.set_xlabel('score/g')
plt.show()

现在大致还不好区分,使用KMeans分别查看簇群数从1到10之间的聚类情况,循环迭代出每一个簇群数下的三维图,经过实验发现,簇群数为3或4时效果最好

# KMeans聚类
from sklearn.cluster import KMeans
wcss=[]
# 定义簇群为10
for i in range(1,11):y_pred = KMeans(n_clusters=i, random_state=9).fit_predict(X)wcss.append(kmeans.inertia_)ax = plt.subplot(1,1,1,projection='3d')plt.scatter(X[:,0], X[:,1],X[:,2] ,c=y_pred)ax.set_zlabel('error/g')ax.set_ylabel('time/g')ax.set_xlabel('score/g')ax.set_title(i)plt.show()

总结下kmeans实现的整个过程,理解起来就是基于各个簇群结点之间对于距离的度量,通过可视化簇群数值的收敛过程,下面是算法的过程

这里k值就代表着最优簇群数,选择最优k值看的是sse(误差平方和)这个指标其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏,手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

# 可视化最优的k值
print([i for i in  wcss])
plt.plot(range(1,11),wcss)
plt.title('The Elbow Method')
plt.xlabel('no of clusters')
plt.ylabel('wcss')
plt.show()

可发现k值在k=4时之后趋于平稳,逐渐收敛,接下来以k=4去建立模型

模型的建立的代码如下

kmeansmodel = KMeans(n_clusters= 4, init='k-means++', random_state=0)
y_kmeans= kmeansmodel.fit_predict(X)
print(y_kmeans)

ax = plt.figure().add_subplot(111, projection = '3d')
ax.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], X[y_kmeans == 0, 2], c = 'r', marker = 'o') #点为红色三角形
ax.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], X[y_kmeans == 1, 2], c = 'y', marker = 'o') #点为红色三角形
ax.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], X[y_kmeans == 2, 2], c = 'b', marker = 'o') #点为红色三角形
ax.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], X[y_kmeans == 3, 2], c = 'g', marker = 'o') #点为红色三角形
#设置坐标轴
ax.set_xlabel('score/g')
ax.set_ylabel('time/g')
ax.set_zlabel('error/g')
#显示图像
plt.show() 

聚类出的效果还是可以的,接下来将y_kmeans(聚类出的结果)代入到原数据集中,看下算法的效果如何

# 将类别合并到原数据集合中
cluster_result = pd.DataFrame(y_kmeans)
result = pd.concat([dataset,cluster_result],axis=1)
result.head(10)

将所有数据按照最后一列的值升序,最终效果

result.sort_values(0,inplace=True)

1号簇群(当年的明星球员) 当时老科还在~

0号簇群(板凳球员)

2号簇群(强势替补+第六人)

3号簇群(饮水机管理员)

这个算法还是很酷的,理解起来很简单,但是遇到一些高维复杂的数据就需要具体问题具体分析了,还有很多优化的地方,诸如改进使用层次法,密度法聚类或者集成聚类等等,以后遇到再来总结,今天就梳理到这,感谢观看

参考资料

  • https://baike.baidu.com/item/K均值聚类算法

  • https://lab.datafountain.cn

  • https://blog.csdn.net/u010062386/article/details/82499777

  • 吴恩达机器学习 https://www.bilibili.com/video/BV164411S78V?p=77

数据集

  • 数据集在我的csdn上,直接进链接下载即可 https://download.csdn.net/download/qq_37756310/18470150

最近打算玩下知乎,喜欢的朋友也可以互相关注啊~

点个

在看

你最好看

以nba球员数据学习聚类算法相关推荐

  1. 基于K-Means聚类算法对NBA球员数据的聚类分析

      聚类分析的研究成果主要集中在基于距离(或者称为基于相似度)的聚类方法,用距离来作为相似性度量的优点是十分直观,从我们对物体的识别角度来分析,同类的数据样本是相互靠近的,不同类样本应该相聚较远.K- ...

  2. 基于k-means聚类算法对NBA球员数据的一次聚类分析

    数据挖掘大作业 前言 本章工具 k-means介绍 k-means原理 最佳k值的确定 拐点法 轮廓系数法 聚类运算 结果分析 小结 参考文献 前言 聚类分析的研究成果主要集中在基于距离(或者称为基于 ...

  3. 秀,用NBA球员数据学透K-Means聚类

    这次我们用 NBA 球员赛季表现聚类来探讨下 K-Means 算法,K-Means 是一个清晰明白的无监督学习方法,和 KNN 有很多相似点,例如都有超参数 K,前者是 K 个类别,后者是 K 个邻居 ...

  4. 文献记录(part75)--基于最大平均熵率的大数据关联聚类算法

    学习笔记,仅供参考,有错必纠 基于最大平均熵率的大数据关联聚类算法 摘要 聚类是数据挖掘和机器学习中的基本任务之一 . 传统聚类方法由于其设计中对簇结构假设的限制 , 导致算法在不符合其假设的数据集上 ...

  5. 文献记录(part15)--面向高维数据的聚类算法研究

    学习笔记,仅供参考,有错必究 面向高维数据的聚类算法研究 摘要 随着信息技术的发展,数据的维度在不断增加,传统的聚类算法将面临以下挑战和问题: 高维数据包含大量冗余的.不相干的信息,数据之间的差异性可 ...

  6. 用python做一个数据查询软件_使用Python实现NBA球员数据查询小程序功能

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于早起Python ,作者投稿君 一.前言 有时将代码转成带有界面的程序,会极大地方便 ...

  7. python进行数据查询_使用Python实现NBA球员数据查询小程序功能

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于早起Python ,作者投稿君 一.前言 有时将代码转成带有界面的程序,会极大地方便 ...

  8. scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...

  9. 生物效应大数据评估聚类算法的并行优化

    生物效应大数据评估聚类算法的并行优化 彭绍亮1,2,杨顺云2,孙哲1,程敏霞1,崔英博2,王晓伟2,李非3,伯晓晨3,廖湘科2 1. 湖南大学信息科学与工程学院&国家超级计算长沙中心,湖南 长 ...

最新文章

  1. com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4e47db1f -- Acquisition Attempt Failed!!!
  2. WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
  3. CentOS7防火墙服务(Firewalld)关闭实战
  4. python将照片转文字_Python将图片转化成文字
  5. 1027. Colors in Mars
  6. android下raw目录的作用,【android】读取/res/raw目录下的文件
  7. 计算机辅助设计基础学什么,东大计算机辅助设计基础X20秋学期《计算机辅助设计基础》在线平时作业3资料...
  8. idea自动导入jar包的快捷键
  9. 面试官 | Nginx 是什么?有什么作用?
  10. android 屏蔽快速点击,Android-如何防止用户过快频繁点击按钮(一)
  11. Laravel核心解读 -- Request
  12. 撞击测试软件,碰撞检测用什么软件?你会用Navisworks做碰撞检测吗?
  13. Node进阶:核心模块http简介
  14. Python pip freeze获取安装的Python包并使用pip install -r还原到这些包环境(转载)
  15. 2008服务器系统安装哪个版本好,Windows Server 2008和Windows Server 2008 R2哪个更好,其中可选的安装版本那个最高级,都有什么用?...
  16. DW集训营数据库Mysql梳理[五]
  17. 操作系统原理1-3章答案 黑新宏 胡元义主编
  18. ORA-01033问题解决
  19. 你能用研发局域网服务器做什么
  20. 风向值与风向描述定义

热门文章

  1. head, tail, catI(linux) in powershell
  2. 与公共云提供商进行谈判的3个技巧
  3. android app 三星s8 适配问题 和 meta-data 动态修改
  4. 可视化开发平台的内容介绍
  5. 黑科技新添成员, 小米mix5再次创新, 但这些真的只是黑科技的全部吗?
  6. 【Mac环境】mac在线安装brew时返回443链接被拒绝或超时错误解决方案
  7. uni-app学习 style样式和三元运算符用法(三)
  8. 2018第四届美亚杯全国电子数据取证大赛团队赛wp
  9. 做个程序员到底好不好
  10. xm-select使用