Kmeans++聚类算法原理与实现
1 引例
在上一篇文章中,笔者介绍了什么是聚类算法,并且同时还介绍了聚类算法中应用最为广泛的KmeansKmeansKmeans聚类算法。从KmeansKmeansKmeans聚类算法的原理可知,KmeansKmeansKmeans在正式聚类之前首先需要完成的就是初始化kkk个簇中心。同时,也正是因为这个原因,使得KmeansKmeansKmeans聚类算法存在着一个巨大的缺陷——收敛情况严重依赖于簇中心的初始化状况。试想一下,如果在初始化过程中很不巧的将kkk个(或大多数)簇中心都初始化了到同一个簇中,那么在这种情况下KmeansKmeansKmeans聚类算法很大程度上都不会收敛到全局最小值。也就是说,当簇中心初始化的位置不得当时,聚类结果将会出现严重的错误。
如图所示的数据集仍旧是在上一篇文章中我们所用到的人造数据集,不同的是在进行聚类时我们人为的将三个簇中心初始化了到一个簇中。其中iter=0
时的情况为未开始聚类前根据每个样本的真实簇标签所展示的情况,其中蓝色、绿色和橙色分别表示三个簇的分布情况,三个黑色圆点为初始化的簇中心。从上图中可以发现,KmeansKmeansKmeans在进行完第10次迭代后,将最上面的一个簇分为了两个簇,将下面的两个簇划分成了一个簇。同时,当进行完第30次迭代后,可以发现算法已经开始收敛,后续簇中心并没有发生任何变化。最终的结果仍旧是将上面一个簇分为两个,下面两个簇划分为一个。
通过上面这个例子我们知道,初始簇中心的位置会严重影响到KmeansKmeansKmeans聚类算法的最终结果,那么我们该怎么最大可能的避免这种情况呢?此时就开始轮到Kmeans++Kmeans++Kmeans++算法登场了。
2 Kmeans++聚类算法
Kmeans++Kmeans++Kmeans++[1],仅从名字也可以看出它就是KmeansKmeansKmeans聚类算法的改进版,那它又在哪些地方对KmeansKmeansKmeans进行了改进呢?一言以蔽之,Kmeans++Kmeans++Kmeans++算法仅仅只是在初始化簇中心的方式上做了改进,其它地方同KmeansKmeansKmeans聚类算法一样。
2.1 Kmeans++原理
Kmeans++Kmeans++Kmeans++在初始化簇中心时的方法总结成一句话就是:**逐个选取kkk个簇中心,且离其它簇中心越远的样本点越有可能被选为下一个簇中心。**其具体做法如下(其中引用英文部分论文原文):
①从数据集X\mathcal{X}X中随机(均匀分布)选取一个样本点作为第一个初始聚类中心cic_ici;
1a. Take one center c1c_1c1, chosen uniformly at random from X\mathcal{X}X.
②接着计算每个样本与当前已有聚类中心之间的最短距离,用D(x)D(x)D(x)表示;然后计算每个样本点被选为下一个聚类中心的概率P(x)P(x)P(x),最后选择最大概率值所对应的样本点作为下一个簇中心;
1b. Take a new center cic_ici, choosing x∈Xx\in\mathcal{X}x∈X with probability P(x)P(x)P(x).
P(x)=D(x)2∑x∈XD(x)2(1)P(x)=\frac{D(x)^2}{\sum_{x\in\mathcal{X}}D(x)^2}\tag{1} P(x)=∑x∈XD(x)2D(x)2(1)
③重复第②步,直到选择出kkk个聚类中心;
1c. Repeat Step 1b. until we have taken kkk centers altogether.
从公式(1)(1)(1)也可以看成,距离现有簇中心越远的样本点,越可能被选为下一个簇中心。
2.2 计算示例
在上面的内容中,我们已经介绍了Kmeans++Kmeans++Kmeans++聚类算法在初始化簇中心时的具体步骤,不过仅仅只是列出公式显然不是本系列文章的风格。下面,我们就通过一个例子来实际计算一下簇中心的选择过程。
如图所示为所有的样本点,且很明显的就能看成一共包含有3个簇,这也就意味着我们需要找到3个簇中心。我们假设第一步选择的是将7号样本点$(1,2)$作为第一个初始聚类中心,那么在进行第二个簇中心的查找时,我们就需要计算所有样本点到7号样本点的距离,然后进行一个归一化。由此我们就能得到如下表格:
从表中可以看出,离7号样本点最远的是2号和12号样本点(其实从图中也可以看出),因此$Kmeans++$就会选择2号样本点为下一个聚类中心。接着,我们再次重复步骤二又能得到下面这个表格:
从表中可以看出,离2号和7号样本点最远的是12号样本点,所以下一个簇中心就会是12号样本点。进一步,我们可以得到如下可视化结果:
### 2.3 编程实现
由于Kmeans++Kmeans++Kmeans++算法仅仅只是在簇中心初始化方法上做了改变,因此只需要重写该函数即可。
def InitialCentroid(x, K):c0_idx = int(np.random.uniform(0, len(x)))centroid = x[c0_idx].reshape(1, -1) # 选择第一个簇中心k = 1n = x.shape[0]while k < K:d2 = []for i in range(n):subs = centroid - x[i, :]dimension2 = np.power(subs, 2)dimension_s = np.sum(dimension2, axis=1) # sum of each rowd2.append(np.min(dimension_s))new_c_idx = np.argmax(d2)centroid = np.vstack([centroid, x[new_c_idx]])k += 1return centroidif __name__ == '__main__':x, y = make_data()K = len(np.unique(y))# y_pred = kmeans(x, y)y_pred = kmeanspp_visual(x,y,K)nmi = normalized_mutual_info_score(y, y_pred)print("NMI by ours: ", nmi)model = KMeans(n_clusters=K, init='k-means++')model.fit(x)y_pred = model.predict(x)nmi = normalized_mutual_info_score(y, y_pred)print("NMI by sklearn: ", nmi)#结果:
NMI by ours: 0.9456935014894648
NMI by sklearn: 0.9456935014894648
最终,我们再次将先前的人造模拟数据进行聚类便可以得到如下可视化结果:
从图示中可以看到,初始化的簇中心彼此相距都十分的远,从而不可能再发生初始簇中心在同一个簇中的情况。同时需要说明的是,sklearn中$Kmeans$聚类算法的默认中心选择方式就是通过$Kmeans++$的原理来实现的,通过参数`init=k-means++`来控制。
到此为止,我们就介绍完了Kmeans++Kmeans++Kmeans++聚类算法的的主要思想。
3 总结
在本篇文章中,笔者首先介绍了KmeansKmeansKmeans聚类算法在初始化簇中心上的弊端;然后介绍了Kmeans++Kmeans++Kmeans++这种聚类算法对初始化簇中心的改进,当然改进方法也不止一种;最后还介绍了如何通过python来编码实现初始化方法,同时还对聚类结果进行了可视化。本次内容就到此结束,感谢阅读!
若有任何疑问与见解,请发邮件至moon-hotel@hotmail.com并附上文章链接,青山不改,绿水长流,月来客栈见!
引用
[1]Kmeans++ http://ilpubs.stanford.edu:8090/778/1/2006-13.pdf
[2]示例代码 : https://github.com/moon-hotel/MachineLearningWithMe
近期文章
[1]Kmeans聚类算法
[2]原来这就是支持向量机
[3]朴素贝叶斯算法
Kmeans++聚类算法原理与实现相关推荐
- 【机器学习】—— K-means聚类算法原理详解 以及 二维、三维数据的K-means聚类Python实现
文章目录 一.K-Means聚类算法原理过程 1.1 K-means聚类的一些细节 1.1.1 样本x(i)x^{(i)}x(i)与中心点μkμ_kμk距离的衡量 1.1.2 K-means聚类算法 ...
- 人工智能AI常见的经典K-means聚类算法原理和工作过程
K-means聚类算法亦称K聚类均值算法,K-means算法是硬聚类算法中的一种.聚类算法是一类无监督机器学习.K-means算法是计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法.K-me ...
- K-Means聚类算法原理
来自:https://www.cnblogs.com/pinard/p/6164214.html K-Means算法是无监督聚类算法,它有很多变体.包括初始化优化K-Means++,距离计算优化elk ...
- K-Means聚类算法原理及其python和matlab实现
(一)何谓聚类 还是那句"物以类聚.人以群分",如果预先知道人群的标签(如文艺.普通.2B),那么根据监督学习的分类算法可将一个人明确的划分到某一类:如果预先不知道人群的标签,那就 ...
- 数据挖掘十大算法(二):K-means聚类算法原理与实现
参考: 1.机器学习-KMeans聚类 K值以及初始类簇中心点的选取 2.K-Means算法的研究分析及改进 一.K-means算法原理 K-means算法是最常用的一种聚类算法.算法的输入为一个样本 ...
- K均值(K-means)聚类算法原理与代码详解
0. 算法原理: 上述过程简单描述: a: 初始数据 b: 选择质点 c: 根据质点划分 d: 求均值,更新质心点 e: 划分 f: 更新质心点 1. 代码实现: # K means 教程# 0. 引 ...
- k-means聚类算法原理与参数调优详解
https://www.toutiao.com/a6690435044869145101/ k-means算法原理 K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初 ...
- K-means聚类算法原理与实现——笔记梳理
转载于:https://www.toutiao.com/a6690435044869145101/ 转载于:https://blog.csdn.net/ten_sory/article/details ...
- K-means聚类算法原理及c++实现
聚类是指根据数据本身的特征对数据进行分类,不需要人工标注,是无监督学习的一种.k-means算法是聚类算法中最简单的算法之一. k-means 算法将n个数据对象划分为 k个聚类以便使得所获得的聚类满 ...
最新文章
- poj2503 Babelfish
- 苹果史上最强芯片竟然是个“组装货”!iPhone SE涨价,13系列是真绿了
- mysql容器重启数据是否丢失_docker重启后数据是否会丢失
- 1.1ASP.NET Web API 2入门
- Jfreechart显示数据点图表(线上可以显示点数据)
- 【渝粤题库】国家开放大学2021春1379人文英语3题目
- 大数据学习-python通过Pyhive连接hive数据库
- ios支付宝支付失败不回调_为什么 iOS 支付成功后能回到 APP ,但是没有回调?...
- 1910101811
- JavaScript 实现回文解码
- pycharm的todo和fixme标记,标志为今后再做和bug点
- MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)
- linux系统可以安装Adobe,Ubuntu 64位安装Adobe Reader 9.5.5
- svn合并分支到主干,工具操作
- 如何将火星坐标(高德、谷歌、腾讯地图坐标)转换为国家2000(或WGS84)坐标系?
- Vue--搭建个人博客
- 取消WIN10上shift键切换中英文输入法的设置
- Keras中verbose的作用
- pytorch Cosine Annealing LR
- 拉格朗日乘数法 —— 通俗理解
热门文章
- 图片检索开发过程实录
- ThreadPool.QueueUserWorkItem 方法 (WaitCallback)
- linux中的一个看图的软件
- java+mysql 基于ssm的网上甜品店系统
- Hadoop词频统计
- 英特尔安腾服务器芯片,INTEL服务器有过至强安腾 !服务器是指什么的?不是cpu吗?...
- SolidWork转Unity
- 学术前沿 | 规律与因果:大数据对社会科学研究冲击之反思
- MySQL查找重复记录
- java 打印三维数组,Java三维数组