点击上方“Datawhale”,选择“星标”公众号

第一时间获取价值内容

K-means 是我们最常用的基于距离的聚类算法,其认为两个目标的距离越近,相似度越大。

算法

1.1 牧师-村民模型
K-means 有一个著名的解释:牧师—村民模型:
有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。
听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。
牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……
就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。
我们可以看到该牧师的目的是为了让每个村民到其最近中心点的距离和最小。
1.2 算法步骤
所以 K-means 的算法步骤为:
  1. 选择初始化的 k 个样本作为初始聚类中心  ;
  2. 针对数据集中每个样本  计算它到 k 个聚类中心的距离并将其分到距离最小的聚类中心所对应的类中;
  3. 针对每个类别  ,重新计算它的聚类中心 (即属于该类的所有样本的质心);
  4. 重复上面 2 3 两步操作,直到达到某个中止条件(迭代次数、最小误差变化等)。
1.3 复杂度
我们先看下伪代码:

时间复杂度:,其中,t 为迭代次数,k 为簇的数目,n 为样本点数,m 为样本点维度。
空间复杂度:,其中,k 为簇的数目,m 为样本点维度,n 为样本点数。

优缺点

2.1 优点
  • 容易理解,聚类效果不错,虽然是局部最优, 但往往局部最优就够了;
  • 处理大数据集的时候,该算法可以保证较好的伸缩性;
  • 当簇近似高斯分布的时候,效果非常不错;
  • 算法复杂度低。
2.2 缺点
  • K 值需要人为设定,不同 K 值得到的结果不一样;
  • 对初始的簇中心敏感,不同选取方式会得到不同结果;
  • 对异常值敏感;
  • 样本只能归为一类,不适合多分类任务;
  • 不适合太离散的分类、样本类别不平衡的分类、非凸形状的分类。

算法调优与改进

针对 K-means 算法的缺点,我们可以有很多种调优方式:如数据预处理(去除异常点),合理选择 K 值,高维映射等。以下将简单介绍:
3.1 数据预处理
K-means 的本质是基于欧式距离的数据划分算法,均值和方差大的维度将对数据的聚类产生决定性影响。所以未做归一化处理和统一单位的数据是无法直接参与运算和比较的。常见的数据预处理方式有:数据归一化,数据标准化。
此外,离群点或者噪声数据会对均值产生较大的影响,导致中心偏移,因此我们还需要对数据进行异常点检测。
3.2 合理选择 K 值
K 值的选取对 K-means 影响很大,这也是 K-means 最大的缺点,常见的选取 K 值的方法有:手肘法、Gap statistic 方法。
手肘法:
当 K < 3 时,曲线急速下降;当 K > 3 时,曲线趋于平稳,通过手肘法我们认为拐点 3 为 K 的最佳值。
手肘法的缺点在于需要人工看不够自动化,所以我们又有了 Gap statistic 方法,这个方法出自斯坦福大学的几个学者的论文:Estimating the number of clusters in a data set via the gap statistic
其中  为损失函数,这里  指的是  的期望。这个数值通常通过蒙特卡洛模拟产生,我们在样本里所在的区域中按照均匀分布随机产生和原始样本数一样多的随机样本,并对这个随机样本做 K-Means,从而得到一个 。如此往复多次,通常 20 次,我们可以得到 20 个  。对这 20 个数值求平均值,就得到了的近似值。最终可以计算 Gap Statisitc。而 Gap statistic 取得最大值所对应的 K 就是最佳的 K。
由图可见,当 K=3 时,Gap(K) 取值最大,所以最佳的簇数是 K=3。
Github 上一个项目叫 gap_statistic,可以更方便的获取建议的类簇个数。
3.3 采用核函数
基于欧式距离的 K-means 假设了了各个数据簇的数据具有一样的的先验概率并呈现球形分布,但这种分布在实际生活中并不常见。面对非凸的数据分布形状时我们可以引入核函数来优化,这时算法又称为核 K-means 算法,是核聚类方法的一种。核聚类方法的主要思想是通过一个非线性映射,将输入空间中的数据点映射到高位的特征空间中,并在新的特征空间中进行聚类。非线性映射增加了数据点线性可分的概率,从而在经典的聚类算法失效的情况下,通过引入核函数可以达到更为准确的聚类结果。
3.4 K-means++
我们知道初始值的选取对结果的影响很大,对初始值选择的改进是很重要的一部分。在所有的改进算法中,K-means++ 最有名。
K-means++ 算法步骤如下所示:
  1. 随机选取一个中心点  ;
  2. 计算数据到之前 n 个聚类中心最远的距离 ,并以一定概率  选择新中心点  ;
  3. 重复第二步。
简单的来说,就是 K-means++ 就是选择离已选中心点最远的点。这也比较符合常理,聚类中心当然是互相离得越远越好。
但是这个算法的缺点在于,难以并行化。所以 k-means II 改变取样策略,并非按照 k-means++ 那样每次遍历只取样一个样本,而是每次遍历取样 k 个,重复该取样过程  次,则得到  个样本点组成的集合,然后从这些点中选取 k 个。当然一般也不需要  次取样,5 次即可。
3.5 ISODATA
ISODATA 的全称是迭代自组织数据分析法。它解决了 K 的值需要预先人为的确定这一缺点。而当遇到高维度、海量的数据集时,人们往往很难准确地估计出 K 的大小。ISODATA 就是针对这个问题进行了改进,它的思想也很直观:当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。

收敛证明

我们先来看一下 K-means 算法的步骤:先随机选择初始节点,然后计算每个样本所属类别,然后通过类别再跟新初始化节点。这个过程有没有想到之前介绍的 EM 算法。
我们需要知道的是 K-means 聚类的迭代算法实际上是 EM 算法。EM 算法解决的是在概率模型中含有无法观测的隐含变量情况下的参数估计问题。在 K-means 中的隐变量是每个类别所属类别。K-means 算法迭代步骤中的 每次确认中心点以后重新进行标记对应 EM 算法中的 E 步 求当前参数条件下的 Expectation。而 根据标记重新求中心点对应 EM 算法中的 M 步 求似然函数最大化时(损失函数最小时)对应的参数
首先我们看一下损失函数的形式:
其中:
为了求极值,我们令损失函数求偏导数且等于 0:
k 是指第 k 个中心点,于是我们有:
可以看出,新的中心点就是所有该类的质心。
EM 算法的缺点就是,容易陷入局部极小值,这也是 K-means 有时会得到局部最优解的原因。

参考

[1] 《机器学习》周志华 
[2] https://zhuanlan.zhihu.com/p/20463356 
[3] http://sofasofa.io/forum_main_post.php?postid=1000282

一文详尽系列之K-means算法相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. python机器学习案例系列教程——K最近邻算法(KNN)、kd树

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 K最近邻简介 K最近邻属于一种估值或分类算法,他的解释很容易. 我们假设一个人的优秀成为设定为1.2.3.4.5.6.7.8.9.10 ...

  3. 机器学习算法系列之K近邻算法

    本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...

  4. Python反反爬系列(一)----K近邻算法与CSS动态字体加密

    声明:文章仅源自个人兴趣爱好,不涉及他用,侵权联系删. 网站不好直接给出,给出论坛无法过审,观看破解过程即可. 1.字体反爬 字体反爬也就是自定义字体加密映射,通过调用自定义的字体文件来渲染网页中的文 ...

  5. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  6. 一文详尽系列之EM算法

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 EM 算法,全称 Expectation Maximization Algorithm ...

  7. 一文详尽系列之逻辑回归

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 模型介绍 Logistic Regression 是一个非常经典的算法,其中也包含了非 ...

  8. 一文详尽系列之模型评估指标

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针 ...

  9. 一文详尽之支持向量机算法!

    Datawhale干货 作者:小一,Datawhale优秀学习者 寄语:本文介绍了SVM的理论,细致说明了"间隔"和"超平面"两个概念:随后,阐述了如何最大化间 ...

最新文章

  1. oracle12c审计功能,oracle 12c开启关闭统一审计
  2. NTU 课程笔记 CV6422 Statistical Methods Applications (1) 基本统计知识
  3. 二项分布均值和方差的简单推导
  4. canvas画布属性globalAlpha 和 createRadialGradient函数出现的设置问题
  5. 【深度学习】NetAug(网络增强)—Dropout的反面
  6. 每日两SQL(6),欢迎交流~
  7. .NET Worker Service 作为 Windows 服务运行及优雅退出改进
  8. 手把手教用XNA开发winphone7游戏(三)
  9. 【Python】Matplotlib绘制极坐标螺旋线图
  10. 昆仑通态触摸屏数据转发上传_说说昆仑通态(MCGS)的数组功能
  11. C++语音识别接口快速入门(Microsoft Speech SDK)
  12. hcia第五天 结课
  13. C++二叉树的 前中后序遍历(学C++必看必会)深度优先遍历详解
  14. CentOS8 离线安装 汉语拼音
  15. lisp princ详解_LISP - 输入和输出(Input Output)
  16. 阿里研究院副院长:数字化转型的十个本质
  17. 关于MYSQL:什么是MySQL?为什么用MySQL?
  18. NeHe OpenGL第二十九课:Blt函数
  19. 链表---给定一个排序链表,删除所有重复的元素每个元素只留下一个
  20. input输入框只能输入整数

热门文章

  1. test markdown
  2. 记录下,我们平时开发当中不得不知道的HTTP状态码
  3. Java与UML交互图
  4. 【青少年编程】黄羽恒:平行空间
  5. 【Python】百度翻译的爬虫实现(后篇)
  6. 快收藏!整理了 100 个 Python 小技巧
  7. 十问陆奇:努力、能力和机遇,谁能帮你跑赢未来?
  8. 300道Python面试题,备战春招!
  9. 汇聚6年思想变迁:知识图谱报告幻灯片大全
  10. 中小学AI教育靠谱吗?50%教师教学经验不足1年