手把手的K-means聚类算法教程(含简介及教育数据应用实例 Python实现)

  • 1. K-MEANS的基本原理
  • 2. 数据预处理
    • 2.1 数据读取:from Excel
    • 2.2 数据预处理:标准化Z分数
  • 3. 聚类过程
    • 3.1 K值的选取
      • 手肘法
      • 轮廓系数法
    • 3.2 聚类代码
  • 4. 聚类的评价
    • 4.1内部评估
    • 4.2外部评估
  • 参考资料

这段时间尝试练习了聚类(K-means),过程中有很多疑惑,想要的东西、参照的功能往往单篇博客不能够满足。故而整理,也将好的教程集锦,利己利人。
计划回顾梳理的系列有:
1.K-MEANS聚类算法的应用过程:数据读取-数据预处理-聚类指标的选取(含python代码)-聚类。
2.dataframe的操作整理:数值的读取等

1. K-MEANS的基本原理

K-means几乎是最常用的无监督学习方法,本质上是基于距离进行计算分类,距离越近,相似度越大,会划分成一类。
K的意思是聚成K类,需要我们选择设定。选取的方法见后面。
具体的内容不再赘述,可参照【机器学习】K-means(非常详细)

notes:
通常大家搜到的教程会以鸢尾花二维数据的例子,实际上K-MEANS可以应用于多维特征值的聚类。
需要对数据进行转化,可参见本文后续的案例代码。

2. 数据预处理

这里分析的是游戏log数据(闯关数据),包含很多用户很多列
数据文件是Excel的xlsx格式
前期已经进行了所需的清洗、合并计算,这里重点说明K-MEANS

2.1 数据读取:from Excel

#记得导入相关的包
#我这里是节选,所以并不全哈#这里是将所有的用户特征值导入
#其中username包含0开头的情况(e.g.,’0601‘),为保证不失真,加入了格式控制converters
all_users_features=pd.read_excel("analysis_add_posttest.xlsx",converters = {u'user_name':str})

2.2 数据预处理:标准化Z分数

这里要注意的是:标准化和归一化
标准化:Z-score=(value-mean)/std
归一化:MAX-MIN,new value=(value-min)/(max-min), new-value总会在[0,1]之间。
一般而言,机器学习用标准化较多。也有特定场景需要使用归一化,可以参照尾部链接。

实现方法

我的实现方法有点冗余,每个用户每列计算的。
精髓在于:z_values=[] 存储一个用户的所有列数据。
因为dataframe 不是特别擅长处理单个单元格的存取,所以最好一行或者一列的操作。

当然,如果你的数据全是float等数值,无字符串也可以直接用dataframe的快捷算法:
标准化: df_norm = (df - df.mean()) / (df.std())
归一化:df_norm = (df - df.min()) / (df.max() - df.min())
记得导入包:
import numpy as np
import pandas as pd


#数据标准化处理
colz=['user_name','z_max_levels','z_avg_star','z_avg_time','z_avg_trys','z_avg_num_ani_tips','z_avg_num_3d_tips','z_FlowExperience','z_PostFolding','z_PostRotation','z_gender','z_age','z_PostRetention','z_PostTransfer','z_PostMotivation']
z_all_users=pd.DataFrame(columns=colz)
#取独一无二的用户值,形成List
user_names=list(set(all_users_features['user_name'].unique()))  #对每一个用户的数据进行标准化
for user in user_names:z_values=[]#对每一列的数据进行标准化for every_col in all_users_features.columns.values[1:]:mean = all_users_features[every_col].values.mean()std = all_users_features[every_col].values.std()z = (all_users_features[all_users_features['user_name']==user][every_col] - mean) / stdz_all_users.loc[z_all_users['user_name']==user,'z_'+every_col]=z  z_values.append(float(z))
#生成Z-score的dataframez_all_users=z_all_users.append({'user_name':user,'z_max_levels':z_values[0],'z_avg_star':z_values[1],'z_avg_time':z_values[2],'z_avg_trys':z_values[3],'z_avg_num_ani_tips':z_values[4],'z_avg_num_3d_tips':z_values[5],'z_FlowExperience':z_values[6],'z_PostFolding':z_values[7],'z_PostRotation':z_values[8],'z_gender':z_values[9],'z_age':z_values[10],'z_PostRetention':z_values[11],'z_PostTransfer':z_values[12],'z_PostMotivation':z_values[13]},ignore_index=True)z_all_users
#选取聚类的特征值列,将其Z分数转换为float
#还是那句话,记得导入相关的包 import numpy as np
X = np.array(z_all_users.iloc[:,1:],type(float))

3. 聚类过程

3.1 K值的选取

手肘法

代码实现,手肘图
如何根据手肘图选择K值:模拟肘部形状,肘部位置就是最佳的K值。
手肘法的原理:参见kmeans最优k值的确定方法-手肘法和轮廓系数法

from sklearn.cluster import  KMeans
sumDs=[]
for i in range(1,15):kmeans=KMeans(n_clusters=i)kmeans.fit(X)sumDs.append(kmeans.inertia_)print(kmeans.inertia_)
plt.plot(range(1,15),sumDs)
plt.title('the Elbow method')
plt.xlabel('number of cluster k')
plt.ylabel('SSE')
plt.show()

轮廓系数法

简要来说,一般选择值越大的越好。
但是也要轮廓系数最高的不一定是最佳的选择,需要看数据的分布情况。具体可以参照:Python实现K-Means聚类(案例:用户分类),这里我没仔细研究。以下代码是我摘录出我用到的部分,原博客更详细。


from sklearn import metrics
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples#分别创建分群2-15的KMeans模型
clusters = range(2,15)
sc_scores = []
for k in clusters:  kmeans_model = KMeans(n_clusters=k).fit(X)sc_score = metrics.silhouette_score(X, kmeans_model.labels_)sc_scores.append(sc_score)print(sc_scores)
#作出K—平均轮廓系数曲线
plt.figure()
plt.plot(clusters, sc_scores, 'bx-')
plt.rcParams['figure.figsize'] = [12,8]
plt.xlabel('k',fontsize=18)
plt.ylabel('Silhouette Coefficient Score',fontsize=18)  #样本平均轮廓系数
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()

3.2 聚类代码

输出分类值的信息,调用已有的算法进行计算。
cluster =KMeans(n_clusters=4).fit(X)
X是前述处理转换好的数据集

#选择要聚的类别数,进行计算,我这里选择的4类进行聚类,并输出其轮廓系数。
cluster =KMeans(n_clusters=4).fit(X)
labels = cluster.labels_
pgjg1=metrics.silhouette_score(X, labels, metric='euclidean')   #轮廓系数
print('聚类结果的轮廓系数=',pgjg1)

4. 聚类的评价

参见:十分钟掌握聚类算法的评估指标

4.1内部评估

轮廓系数(Silhouette Coefficient)
Calinski-Harabaz指数(Calinski-Harabaz Index)
戴维森堡丁指数(DBI, Davies-Bouldin Index)

4.2外部评估

兰德指数(RI, Rand index)
调整兰德系数(Adjusted Rand index)
标准化互信息(NMI, Normalized Mutual Information)
调整互信息(AMI, Adjusted mutual information)
同质性度量和完整性度量的调和平均(V-measure)
Fowlkes-Mallows Scores(FMI)

参考资料

机器学习面试之归一化与标准化
【机器学习】K-means(非常详细)
kmeans最优k值的确定方法-手肘法和轮廓系数法
python 实现k-means聚类算法 银行客户分组画像实战(超详细,附源码)
Python实现K-Means聚类(案例:用户分类)
十分钟掌握聚类算法的评估指标

手把手的K-means聚类算法教程(含简介及教育数据应用实例 Python实现)相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  6. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  7. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  8. K均值聚类算法(Kmeans)讲解及源码实现

    K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...

  9. 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

    一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...

最新文章

  1. 如何应对缓存穿透和缓存雪崩问题?极其重要
  2. Spark参数配置说明
  3. 在线编辑fckeditor3
  4. 用什么软件写html语言,写html代码用什么软件
  5. 学科分类号查询 计算机工程,学科分类与代码分类号查询.doc
  6. 小米3g刷高格固件_高恪可刷机型清单
  7. 【数学建模】算法模型(三)|模糊综合和灰色关联分析 元胞自动机模型 图论 BP神经网络算法 马尔可夫链蒙特卡罗算法(MCMC)
  8. MATLAB中改变默认工作路径的方法
  9. 天下会 - 搜索经验之网络搜索技巧总结
  10. html实现分级目录线,jQuery 实现支持分级标题标签的文章目录
  11. AS(强直性脊柱炎)完全手册
  12. CSDN的C币获得方法
  13. 垂直搜索引擎的存在意义
  14. 最近在使用vue的时候,发现竟然不会引入图片,悲哀啊,于是乎。。。
  15. 前端zrender框架使其可拖拽
  16. 一次同余式和中国剩余定理
  17. nextcloud手动插件_Nextcloud插件·Mail
  18. 10行代码掌握python基本语法元素_Python-基础课程学习(1)
  19. 计算机信息检索系统中常用的检索技术,在计算机信息检索系统中,常用的检索技术主要有哪些...
  20. R语言使用lm函数构建线性回归模型、使用lrtest包的dwtest函数执行残差自相关检验Durbin–Watson检验(Autocorrelation Durbin–Watson Test)

热门文章

  1. 封装vue导出excel组件(扩展嵌入图片、操作工作表、表格样式等功能)
  2. 28.Vue列表排序
  3. C语言学习,VScode下载、安装、环境变量配置、编写调试hello word
  4. Mapxtreme中的胖客户端、瘦客户端及中型客户端介绍
  5. 文档读取 Walden
  6. 指标之王MACD计算公式
  7. RFID线圈全自动绕线机
  8. 基于SSM框架实现的汽车维修管理系统【源码+数据库】
  9. 国产芯片架构下一个目标是600亿颗,将彻底打破美国芯片架构霸权
  10. 阿里巴巴编码规范学习及应用