文章目录

  • 创建数据集
  • n_clusters=4详细画图代码解析
  • 完整代码

前面的文章我们知道了KMeans的常用评估指标 轮廓系数。这篇文章我们介绍怎样通过轮廓系数来确定最佳的n_cluster

创建数据集

创建一个有5个分类的数据集,用于聚类,这里创建数据集我们是知道分类情况的,但是实际中我们是基本不会知道分类情况的。也就没有了最佳的聚类效果参考。所以需要使用到轮廓系数来选择最佳的聚类数量。

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeansimport warnings
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt%matplotlib inline
warnings.filterwarnings("ignore") # 忽略警告# 创建数据集
X, y = make_blobs(n_samples = 500, n_features=2, centers=5, random_state=1)
plt.scatter(X[:, 0], X[:, 1])
plt.title("row data")

n_clusters=4详细画图代码解析

fig, charts = plt.subplots(1, 2)
# 创建一行两列的一张画布
# 返回值第一个为画布本身
# 返回值第二个为子图对象的数组# 设置图像的大小
fig.set_size_inches(14, 5)# 训练模型
km4 = KMeans(n_clusters=4).fit(X)
labels = km4.labels_
sil_samples = silhouette_samples(X, labels) # 计算每个样本点的轮廓系数# 每个聚类填充之间的间隔为20
interval = 20# 每个填充区域的上下限
lower = 0
higher = 0
for i in range(4) :# 将第i个聚类中的每个样本的轮廓系数取出sil_samples_i = sil_samples[labels == i]# 将轮廓系数排序,使得画出的图的一个弧线方便展示sil_samples_i.sort()# 计算填充区域的上界higher = sil_samples_i.shape[0] + lower# 进行填充charts[0].fill_betweenx(np.arange(lower, higher),sil_samples_i,facecolor=cm.nipy_spectral(i/4))# 显示聚类的类别charts[0].text(-0.05, (lower+higher) * 0.5, str(i))# 更新下界lower = higher + interval# 画出轮廓系数的均值线
charts[0].axvline(x=sil_samples.mean(), color='red', linestyle='--')# 设置坐标轴的显示范围
charts[0].set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1.0])
charts[0].set_yticks([])# 画出聚类的结果散点图
charts[1].scatter(X[:, 0], X[:, 1], c=labels)# 画出质心
centers = km4.cluster_centers_
charts[1].scatter(centers[:, 0], centers[:, 1], color='red', marker='x', s=80)plt.show()
# 从图上来看每个聚类中都有较多的部分样本轮廓系数超过了平均水平
# 这说明n_clusters=4是一个比较好的聚类结果


通过上面的代码就能画出一个n_cluster对应的图了。在将上面的代码包装到一个关于n_cluster的循环中,就能实现完整的画图代码了

完整代码

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samplesimport warnings
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm%matplotlib inline
warnings.filterwarnings("ignore") # 忽略警告# 创建数据集
X, y = make_blobs(n_samples = 500, n_features=2, centers=5, random_state=1)for n_clusters in range(2, 9) :# 模型训练km = KMeans(n_clusters=n_clusters).fit(X)labels = km.labels_sil_samples = silhouette_samples(X, labels)# 建立画布fig, charts = plt.subplots(1, 2)fig.set_size_inches(14, 5)interval = 20lower = 0higher=0for i in range(n_clusters) :sil_samples_i = sil_samples[labels == i]sil_samples_i.sort()higher = sil_samples_i.shape[0] + lower# 填充charts[0].fill_betweenx(np.arange(lower, higher),sil_samples_i,facecolor=cm.nipy_spectral(i/n_clusters),alpha=.7)# 显示类别charts[0].text(-0.05, (lower + higher) * 0.5, str(i))lower = higher + interval# 画出轮廓系数的均值线charts[0].axvline(x=sil_samples.mean(), color='red', linestyle='--')# 设置坐标轴charts[0].set_xlabel("silhouette scores")charts[0].set_ylabel("clusters={}".format(n_clusters))charts[0].set_xticks(np.arange(-0.2, 1.2, 0.2))charts[0].set_yticks([])# 画出聚类的结果散点图charts[1].scatter(X[:, 0], X[:, 1], c=labels)# 画出质心centers = km.cluster_centers_charts[1].scatter(centers[:, 0], centers[:, 1], color='red', marker='x', s=80)plt.show()print("for n_clusters = {}, silhouette score = {}\n".format(n_clusters, sil_samples.mean()))




从上面的结果来看n_clusters=2的时候轮廓系数是最高的。但是从每个样本的轮廓系数来看。该聚类结果主要的贡献在第0个聚类。也就是说,第0个聚类的效果很好,但是第一个聚类效果不是很好,大部分的轮廓系数低于平均值。
在具体的应用总怎么选择需要看实际需求,需要结合人力财力来做出最佳的选择。

机器学习sklearn----通过轮廓系数确定适合的n_clusters相关推荐

  1. 机器学习数据分析之-轮廓系数(评估聚类结果)

    在学习使用k-means算法进行负载聚类分析时看到了这样的图,查了之后是用轮廓系数来评估分类结果的准确度或者称合适度. silhouette 是一个衡量一个结点与它属聚类相较于其它聚类的相似程度. 取 ...

  2. [机器学习与scikit-learn-26]:算法-聚类-KMeans寻找最佳轮廓系数

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  3. 机器学习:聚类算法的模型评估指标:轮廓系数

    不同于分类模型和回归,聚类算法的模型评估不是一件简单的事. 在分类中,有直接结果(标签)的输出,并且分类的结果有正误之分,所以使用预测的准确度,混淆矩阵,ROC曲线等指标来进行评估.但无论如何评估,都 ...

  4. Kmeans聚类③——Kmeans聚类原理轮廓系数Sklearn实现

    数据分析目录(文末有超级彩蛋!): 一.Excel系列--四大常用函数及十大高级图表 二.SQL系列--性能优化/多表关联/窗口分析函数等 三.统计学系列--概率论/置信区间/相关/抽样等 四.Pan ...

  5. python sklearn库silhouette_score轮廓系数接口调用

    官方接口说明:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html#sklea ...

  6. 机器学习(三)K-means聚类(手肘法、轮廓系数、可视化代码)

    K-means聚类 聚类是无监督学习当中非常重要的一部分,能够在没有标签的情况下将数据分类.说到聚类,最常用也是最重要的一个算法就是K-means算法. 算法介绍 K-means是一种非常简单快速高效 ...

  7. Sklearn 成长之路(五)K-means聚类及其评价指标——轮廓系数

    聚类结果评价指标--轮廓系数 某个点的轮廓系数定义为: s=disMeanout−disMeaninmax(disMeanout,disMeanin)s =\frac{disMean_{out} - ...

  8. 样本轮廓系数(原理、sklearn.metrics.silhouette_score、silhouette_samples参数介绍)

    一.轮廓系数含义: 轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式. 最佳值为1,最差值为-1.接近0的值表示重叠的群集.负值通常表示样本已分配给错误的聚类,因 ...

  9. 机器学习之K均值的SSE和轮廓系数

    前文回顾: 肘部法:SSE误差平方和 SSE(sum of the squared errors)是对簇松散度的衡量,作为目标函数其实是一个严格的坐标下降(Coordinate Decendet)过程 ...

  10. 轮廓系数sklearn.metrics.silhouette_score

    轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式.最早由 Peter J. Rousseeuw 在 1986 提出.它结合内聚度和分离度两种因素.可以用来在相同原 ...

最新文章

  1. 让瓶颈暴露--监测你的SQL SERVER
  2. linux防火墙常用控制协议,linux防火墙配置及管理.doc
  3. 海思芯片固件修改工具_地平线X3开发板开箱、固件刷写、环境配置
  4. [ JS 进阶 ] Ajax 详解 (2) :XHR 实例 GET 和 POST 异步和同步
  5. 1 加到 100 的 时间复杂度 C#.
  6. 类的继承python 简明_[简明python教程]学习笔记2014-05-04
  7. linux openh264 编译,在Linux下为Android构建openh264
  8. springboot 集成redis_一文详解Spring Boot 集成 Redis
  9. 如何抓获JVM crash的幕后黑手
  10. 【matlab】元胞数组(由元胞数组创建元胞数组)
  11. mysql vc运行库,VC运行库版本 - robslove的个人页面 - OSCHINA - 中文开源技术交流社区...
  12. 用Python实现简单的Web Server
  13. X-Scan 端口扫描工具下载和使用教程
  14. 20道常见的kafka面试题以及答案
  15. 软著申请流程与方法详解
  16. web编程1–用户注册之文本框应用,coon连接,存入mysql
  17. MAC电脑触摸板手势(提高办公效率)
  18. 怎么复制网页上不能复制的文字
  19. 计算机组策略主要功能,组策略概述
  20. CMMI 3级18个过程域

热门文章

  1. Ionic4—JS扩展之ion-refresher下拉刷新
  2. informix 访问mysql_C语言访问INFORMIX数据库
  3. 当今社会到底更需要专才还是通才
  4. 二维数组更改vue,VueX中直接修改数据报错,修改一维数组,二维数组,报错的原因...
  5. 网络托管巨头百万数据外泄、超900万安卓设备感染木马|11月24日全球网络安全热点
  6. dxp交流电源怎么找_ALtium designer 中画原理图的时候怎么放入220V交流电源?急!! 就是那个220V的怎么弄出来?谢了..求......
  7. mysql delete in死锁_delete where in导致的死锁问题
  8. 扁豆凝集素/红藻凝集素GRFT/蓝藻凝集素CVN/香蕉凝集素H84-植物凝集素
  9. Unity镜头特写效果
  10. iOS 【微信登录流程以及遇到的一些坑】