总第210篇/张俊红

关于聚类算法,大家应该都有一定的了解,就是把一群人或者其他数据分成若干类,大家习惯叫做n类,那这个n是怎么确定的呢?很多人可能会说靠拍,靠拍确实也不是不可以。但是总觉得不太科学。那应该怎么办呢?因为聚类是无监督学习,也就是没有正确答案,没有办法知道分几类是正确的,那应该怎么办呢,是不是只能靠拍了?

我们想想聚类的本质,其实就是把一群人(暂且可以理解成我们是对人进行分类)分成若干类,我们希望得到的一个结果就是,类与类之间差别(距离)要尽可能的大,同一类内部之间的差别要尽可能小,因为这样的结果才是我们聚类的目的呀。明确了目标以后,我们就可以开始尝试了,看n取多少的时候结果比较接近我们的目标。这个目标有一个比较正式的名字叫做轮廓系数(silhouette coefficient)。

轮廓系数的计算步骤如下:

  • 计算样本i到同一类中其他样本的平均距离ai。ai越小,说明样本i与同类中其他样本的距离越近,即越相似。我们将ai称为样本i的类别内不相似度。

  • 计算样本i到其他类别的所有样本的平均距离bi,称为样本i与其他类之间的不相似度。bi越大,说明样本i与其他类之间距离越远,即越不相似。

  • 根据样本i的簇内不相似度ai和簇间不相似度bi ,定义样本i的轮廓系数为:


si的值介于[-1,1]之间,越接近于1说明bi越大ai越小,类别内部越相似,类别之间越不相似;越接近于0说明类别内部和类别之间的距离差不多,分界线很不明显;越接近于-1说明类别之间越相似类别内部反而不相似。

了解清楚原理以后,我们来看下在Python中怎么实现,这个系数在Sklearn库中是有现成的包可以供我们使用的:

silhouette_score是获取模型总体的轮廓系数,
silhouette_samples是获取每个样本的轮廓系数。

接下来我们来一个实战案例给大家演示下:

首先把我们需要用到的包导入进来:

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

接下来生成一组模拟数据以备模型使用:

X, y = make_blobs(n_samples=500,n_features=2,centers=4,cluster_std=1,center_box=(-10.0, 10.0),shuffle=True,random_state=1)

生成数据以后,开始训练模型:

kmeans = KMeans(n_clusters = 3,random_state = 0)
kmeans.fit(X)
pred_y = kmeans.predict(X)  # 预测点在哪个聚类中
print(silhouette_score(X, pred_y))

上面模型中我们随便给定一个类别数3,会得出如果把我们的模拟数据生成3类的话轮廓系数是0.58。3个是不是最好的类别数呢?不知道,我们就试吧,写一个for循环,遍历[2,20]类,代码如下:

score = []
for n in range(2,20):kmeans = KMeans(n_clusters = n,random_state = 0)kmeans.fit(X)pred_y = kmeans.predict(X)  # 预测点在哪个聚类中score.append([n,silhouette_score(X, pred_y)])
pd.DataFrame(score).set_index(0).plot(legend = False)
plt.xlabel("聚类个数")
plt.ylabel("轮廓系数")

运行上面代码可以得到不同类别数对应的轮廓系数值,我们根据轮廓系数和业务需求双重目标来确定最佳的类别数。为什么还要考虑业务需求呢?因为我们聚类的结果一般都是需要拿给业务用的,比如用在精细化运营上,如果类别太多,可能不利于业务使用。所以要综合考虑轮廓系数和业务诉求。

如果想要获取每个样本的轮廓系数,则可以使用silhouette_samples函数,使用方法与silhouette_score是一样的,也是需要给定x值和预测的y值。

silhouette_samples(X, pred_y)

掌握了轮廓系数法,以后聚类个数再也不用靠拍了。


公众号推出根据关键词搜索历史文章的工具,点击下面链接可以试试:

你聚类个数是靠拍的?相关推荐

  1. R语言层次聚类:通过内平方和(Within Sum of Squares, WSS)选择最优的聚类K值、以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最优的聚类个数

    通过内平方和(Within Sum of Squares, WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最佳的聚类个数 目录

  2. 数据中聚类个数的确定(Determining the number of clusters in a data set)

    本文主要讨论聚类中聚类个数的确定问题. 本文地址:http://blog.csdn.net/shanglianlm/article/details/46671209 1. K的作用 Intuitive ...

  3. 聚类个数的选择:轮廓系数(计算公式和原理)

    轮廓系数是评估聚类效果的指标,取值范围为[-1,1],越接近1表示聚类效果越好. 在聚类时可用于聚类个数的选择.通过遍历簇数,计算对应轮廓系数,选择轮廓系数最大时对应的聚类模型. Kmeans聚类:对 ...

  4. 基于doc2vec的中文文本聚类及去重

    Understand doc2vec Data introduction Train a model Test the model Cluster all the lyrics Filter out ...

  5. (转)各种聚类算法的系统介绍和比较

    转 各种聚类算法的系统介绍和比较 2018年04月16日 22:15:42 fresh_suger 阅读数:2016 最近项目用到聚类算法,将其系统的总结一下. 一.简要介绍 1.聚类概念 聚类就是按 ...

  6. 各种聚类算法的系统介绍和比较

    最近项目用到聚类算法,将其系统的总结一下. 一.简要介绍 1.聚类概念 聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇 ...

  7. 深入浅出聚类算法!如何对王者英雄聚类分析,探索英雄之间的秘密

    Datawhale 作者:小一,Datawhale优秀学习者 寄语:首先,对聚类算法进行了介绍:然后,解释了EM算法E步.M步的原理:最后,对sklearn参数进行了详解,并对王者荣耀英雄利用EM算法 ...

  8. 【学术研究基础】聚类分析学习

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.什么是聚类分析 聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学, ...

  9. r型聚类典型指标_常用的聚类算法及聚类算法评价指标

    1. 典型聚类算法 1.1 基于划分的方法 代表:kmeans算法 ·指定k个聚类中心 ·(计算数据点与初始聚类中心的距离) ·(对于数据点,找到最近的{i}ci(聚类中心),将分配到{i}ci中) ...

最新文章

  1. 2021 IDEA大会开启AI思想盛宴,用“创业精神”做科研
  2. mysql 8.0 ~ 存储和账户
  3. 讨论帖:比特币中的SHA256算法的实现与标准的SHA256算法实现是否相同?
  4. java 错误 代码_Java错误代码及异常处理
  5. vue/父子组件之间的通信
  6. mysql限制登录次数_mysql会话控制限制登录次数(connection_control插件)
  7. web-ylbtech(合同管理)-数据库设计
  8. C++ vector是什么?应该如何理解
  9. 2020年副业收入!这是我看到的最好的一篇介绍网络兼职的文章
  10. 3.4 常用数据类型的输入 [原创Excel教程]
  11. python余弦定理_基于Python计算气弹簧选型
  12. H5调用相机进行拍照及切换摄像头及踩坑记录
  13. ASPack 2.12
  14. Suspense组件的使用
  15. PhpStorm Unhandled exceptions错误解决
  16. hive -- return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  17. 软件性能测试论文草稿
  18. SK海力士量产采用EUV技术的第四代10纳米级DRAM;捷波朗推出全新降噪耳机;TCL选择亚马逊云科技智能湖仓 | 全球TMT...
  19. Echarts 南海诸岛简图显示位置调整
  20. P5445 [APIO2019]路灯

热门文章

  1. c++调用cplex求解例子_Java调用cplex求解运输问题
  2. 计算机中管理方法科学化的重要性,浅论档案科学化管理的重要性
  3. vi(vim)常用命令汇总
  4. SpringCloud之RestTemplate,几种常见的请求方式
  5. SpringMVC使用及知识点提炼
  6. 谈及未来的 AI, 也许你已身处其中 —— 记 InfoQ 对青云QingCloud 联合创始人林源的采访...
  7. MySQL如何发型不乱的应对半年数十TB数据增量
  8. 纯 as3 项目中引用 fl 包下的类
  9. 在网页中嵌入flash之标签
  10. 什么是编译型和解释型语言?