一、概述

K-Means(K均值)是机器学习中一种常见的无监督算法,它能够将未知标签的数据,根据它们的特征分成不同组,每一组数据又称为“簇”,每一簇的中心点称为“质心”。其基本原理过程如下:

① 任意选择K个初始质心(可以不是样本点),为每个样本点找到与其距离最近的质心,并将样本点与质心归为同一簇,从而生成K个簇;

② 当所有样本点都被分完,对于每一个簇,重新计算新的质心(同一簇中所有点的平均坐标值);

③ 不断迭代,直到不会质心的位置不发生改变。

可见,整个算法中,最核心的参数是K。那么K该如何确定呢?

这里我们引入轮廓系数S:

其计算公式如图所示,其中,a表示样本点与同一簇中所有其他点的平均距离,即样本点与同一簇中其他点的相似度;b表示样本点与下一个最近簇中所有点的平均距离,即样本点与下一个最近簇中其他点的相似度。

K-Means追求的是对于每个簇而言,其簇内差异小,而簇外差异大,轮廓系数S正是描述簇内外差异的关键指标。由公式可知,S取值范围为(-1, 1),当S越接近于1,则聚类效果越好,月接近-1,聚类效果越差。

接下里我们通过代码来实现如何基于轮廓系数确定K值。

二、实践

1、导入相关包

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

2、创建数据集并可视化

在创建数据的过程中,为了可视化效果良好,所以预先给出了centers=4,但不影响我们后面确定K值。

x, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)# 绘图,查看数据样本的分布
fig, ax = plt.subplots(1)
fig.set_size_inches(8,6)
ax.scatter(x[:, 0], x[:, 1], marker='o', s=8)
plt.show()

数据集一共由两列特征组成,即横轴和纵轴。实际应用中,数据往往会有许多列特征,一般需要先通过降维算法(如PCA)将多维特征压缩至二维或者三维,才能可视化。观察上图,乍一看,数据应该能被分成4簇,但有的人觉得分成2簇(左下1簇,右上1簇),或者分成3簇(最下面1簇,中间1簇,右上1簇)也是合理的。

那么到底能分成几类呢?这时就需要通过轮廓系数来帮我们确定。

# 给定K值(n_clusters)的范围
n_clusters = range(2, 5)# 循环绘图
for n in n_clusters:# 创建绘图区域fig, ax = plt.subplots(1)fig.set_size_inches(8, 6)# 实例化cluster = KMeans(n_clusters=n,random_state=10).fit(x)# 访问labels_属性,获得聚类结果y_pred = cluster.labels_# 访问cluster_centers_属性,获得质心坐标centroid = cluster.cluster_centers_# 计算平均轮廓系数silhouette_avg = silhouette_score(x, y_pred)# 绘制聚类结果# y_pred==i会返回布尔数组,从而获得那些被分为同一类的点for i in range(n):ax.scatter(x[y_pred==i, 0],x[y_pred==i, 1],marker='o',s=8,alpha=0.7)   # 绘制质心ax.scatter(centroid[:, 0],centroid[:, 1],marker='x',s=30,c='k')   # 设置图表标题ax.set_title('result of KMeans(n_clusters={})'.format(n))   # 设置x轴标题ax.set_xlabel('feature_1')    # 设置y轴标题ax.set_ylabel('feature_2')   # 设置总标题,用来描述轮廓系数的值plt.suptitle('The average silhouette value is {:.4f}.'.format(silhouette_avg),fontsize=14, fontweight='bold')plt.show()

执行代码后,系统帮我们自动生成了3张图,并告诉我们每张图中,K的取值和平均轮廓系数值。可以看到K=2时,S=0.7050;K=3,S=0.5882;K=4,S=0.6505。当数据集被分为4簇时,轮廓系数比为3簇的高,因此我们舍弃K=3。然而当K=2时,得分竟然是最高的,这与我们最初创建数据集时给的真实分类centers=4是不一致的!

这恰恰说明了:

① 轮廓系数确实能帮助我们确定K的取值,并且分数越接近1,越能代表更好的聚类效果;

② 分数最高的K值,并不一定是正确的聚类结果(虽然我们可能并不知道真实的分类);

③ 实际应用中,需要紧密结合轮廓系数与业务需求,才能得到恰当的结果;

当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K相关推荐

  1. 使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?

    Excel中,我们经常会使用复选框来打勾打叉,这是复选框最基本的功能,相信很多小伙伴都会,但今天我跟大家分享的是复选框的其他操作技巧,勾选复选框变色,统计人数. 下图中,我们要利用复选框是否打钩来确定 ...

  2. html复选框代码隐藏勾勾,[译] 为什么 HTML 中复选框样式难写 — 本文给你答案

    在当今世界,大多数网页开发者认为掌握 JavaScript 是优先选择,这理所当然,因为 JS 是 浏览器脚本语言 .虽然 HTML 和 CSS 决定网站的样式,但是 JS 凭借它能调用 HTML 和 ...

  3. LaTeX生成复选框(打勾打叉),todo list

    文章目录 前言 方案 小结 参考文献 前言 本文旨在讲述:如何在LaTeX中生成复选框(可以打勾打叉的那种),制作todo list. 创作时间:2019年9月30日06:43:55 写这篇文章,主要 ...

  4. 复选框的对勾颜色怎么改

    复选框颜色怎么修改 说来惭愧,改的时候一直在试着改color人,其实不对.我用的是element ui 的复选框,不多说了,直接看代码吧 /deep/ .el-checkbox__inner::aft ...

  5. 支付宝小程序获取复选框选中值id,使其显示且可编辑

    问题概述 在做支付宝小程序编辑表单时,需要将用户之前填.选的信息显示出来后再编辑.这里针对复选框选中值的获取显示,通过服务端发送请求后拿到的选中id,显示选中值并且可编辑. axml代码片段 < ...

  6. HTML复选框,默认打勾

    html中复选框Checkbox 设置默认选中代码 <input name="checkbox" type="checkbox" value=" ...

  7. 如何在word文档里复选框里打勾?

    1.画个文本框,文本框里写一个钩,然后拖过去:或者先在WORD里插入符号"√",然后选中"√",到->格式->中文版式->带圈字符->选 ...

  8. 复选框_是否勾选的判断

    html <label> <input type="checkbox" checked="checked" id="testId&q ...

  9. EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值

    在开发过程中遇到的小案例 效果展示 未处理之前的效果: 处理之后的效果: 需求详情 combotree(树形下拉框)复选框选中父节点时输入框只显示父节点的文本值,但是子节点的状态是选中的. 当所有子节 ...

最新文章

  1. Android 中ContentProvider和Uri详解
  2. 字典树(trie树)、后缀树
  3. 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序
  4. 干货 | 一文概览主要语义分割网络,FCN、UNet、SegNet、DeepLab 等等等等应有尽有
  5. print在python2和python3的区别_Python2和Python3中print的不同点
  6. 实时数据库介绍(转载)
  7. Extjs中renderer:function函数用法
  8. python信息安全书籍_2018年信息安全从业者书单推荐
  9. 利用python从网络上爬取图片_我用Python爬取了妹子网100G的套图
  10. 怎么用java打开pkg文件怎么打开,pkg文件怎么打开 【处置方式】
  11. js第8章事件案例:获取触发事件的元素,阻止事件冒泡和默认行为的实现、缓动的小球、图片放大特效、按Enter键切换
  12. 计算机桌面图标管理,桌面图标怎么管理 桌面图标管理方法介绍
  13. 基于STM32F103单片机的无线病床呼叫系统
  14. 记录一次rpmbuild打包报错,错误码error: Bad exit status from /var/tmp/rpm-tmp.aP0jov (%install)
  15. cocos2dx之MoveTo,MoveBy
  16. Excel NORMINV函数用法
  17. 在线音乐网站的设计和搭建
  18. 仿真设计一个机器臂需要的几个重要步骤
  19. NOTES修改服务器密码,修改notes邮箱服务器地址
  20. java计算机毕业设计科学评价系统源码+数据库+lw文档+系统

热门文章

  1. 5月份升级鸿蒙系统的华为手机名单,鸿蒙OS前三批升级名单曝光,华为荣耀手机可升级,幸福来得太突然...
  2. 【算法】深度学习神经网络都调哪些参数?
  3. [云炬创业基础笔记]创业计划书常见问题
  4. 【SVM最后一课】详解烧脑的Support Vector Regression
  5. python模板语言_Python Django 模板语言之 Tags(标签)
  6. 【CyberSecurityLearning 11】OSI与TCP/IP协议簇以及Packet Tracer模拟器
  7. ubuntu下主目录的路径是什么
  8. Nginx: 413 Request Entity Too Large Error and Solu
  9. 3D数学基础:图形与游戏开发---随笔二
  10. bitcoin 在ubuntu上的安装指南