定义
今天我们来一起学习聚类算法的另一个算法 —— PAM。(Partitioning Around Mediods)还是那个套路,我们可以从名字分解开始初步了解这个算法。我一直认为每个算法的名字都是有意义的,所以我都这么做。
- Partitioning —— 从名字可以得知,它属于partitioning算法,也就是分割聚类算法。和层次聚类不同,它的主要目的是把数据聚成多个簇。
- Mediods —— 这里为了方便中文理解,先把这个单词提上来。Mediods就是K-Mediods。而K-Mediods中的Mediods表示中心点的意思,也就是每一个簇的唯一中心点。
- Around —— 引文翻译是围绕的意思。
所以,PAM算法其实就是簇围绕中心点。所以也可以称为中心点围绕划分法。初步认识算法意思之后,接下来我们将加深学习这个算法。
K-Mediods & K-Means
和以前的文章不一样,我们通过K-Means来引入K-Mediods。然后再来聊它的计算过程。刚刚有提到过K-Mediods。大家按照中文意思理解是不是找到了一个规律。K-Mediods等于K-中心点。那么这个时候你有没有联想到上一篇博客里面提到的K-Means呢?K-Mediods和K-Means到底有什么区别呢?
众所周知,K-Means之所以叫Means,是因为划分数据集的主要逻辑就是不断寻找簇之间的均值。通过这个均值的不断收敛从而得到最终的结果。如果这里有不理解,可以看一下我之前讲K-Means的文章。但很遗憾,K-Means算法并不具备噪音数据的包容性。就像下图一样,如果出现右上角那3个数据点,而他们却与右下角的最相似,那么K-Means则将他们归为依赖。在这个时候也许蓝色的点就是算法最终得到的质心。
这时候,K-Mediods算法往往就能发挥他的功效。它与K-Means最大的区别就是:K-Means是寻找簇中的平均值作为质心。而K-Mediods在寻找到平均值之后,会选一个离这个均值最近的实际点作为质心。也就是常说K-Mediods会以数据集中真正存在的最优点来作为它的质心。所以同样的数据,换成K-Mediods算法会变成下图这样,质心会选择与均值(蓝色点)最为相近的一个数据。
计算过程
这么对比下来是不是瞬间明白K-Mediods做的啥玩意。但别忘了,了解这个我们值知道Mediods,还有两个单词还没讲呢。下面是PAM算法的“作案过程”。
- 首先确定K的值,这里很重要,决定我们要把数据聚合成多少类
- 输入我们想要聚类的数据
- 随机在数据中选择K个点作为质心
- 计算其他点与质心的距离,并聚合到距离紧的一类,得到簇
- 将簇之间每个点之间作为质心都计算一次距离,然后选择距离最小的点作为新的质心。注意这里的质心必须是确切存在的数据,和K-Means是不一样的
- 重复4和5步骤,知道质心不在偏移为止。
通过第4和第5步其实就可以看出来,Means和Mediods的差别在哪里了。所以,它的数学公式是这样的。Ci是质心,Pi是非质心。所以c就是每一个非质心的点到质心的距离的和。最好要实现c是最小的哪一个。也就是min(c)
样例
下面到了举栗子的时刻。这个例子来源于K-Medoids clustering with example。看了一些论文和资料,我觉得没有比这个更简单更容易理解的例子了。但因为文档是英文的。所以下面部分是我个人理解+翻译,希望大家原谅。
假设我有如下的数据:
然后我把这些数据转化成图是这样的
第一步,通过初步分析,我们想把数据聚成2类。所以我设k=2。算法将随机选出两个质心分别为C1 -(3, 4) 和 C2 -(7, 4)。
第二步,计算cost方程使得距离是最短的,也就是每一个点到C1和到C2的距离。
最后得到1,2,5属于C1,而0,3,6,7,8则属于C2。所以cost(C) = (3 + 4 + 4) + (3 + 1 + 1 + 2 + 2) = 20
第三步,选择一个非质心的点,然后计算他们的最短距离。重新得到新的Cost。比如我选择C1 (3, 4) 和 C2 (7, 3) 为质心。从新计算每个点的距离如下表。从表中可以得到,1,2,5属于C1,而0,3,6,7,8属于C2。所以cost(C) = (3 + 4 + 4) + (2 + 2 + 1 + 3 + 3) = 22。但22>20,所以放弃这次的假设。然后继续尝试新的假设直到质心不在便宜为止。
经过一系列的计算,最终我们可以得到2个新的质心。分别是C1 (3, 4) 和 C2(7, 4)。最终的聚类结果如下图
而且我们也能得到这个算法的时间复杂度为:
总结
最后,我们讲讲Partitioning Around Mediods的优缺点。
优点:
- 因为K-Medoid每次只寻找存在的点作为质心。所以这个算法速度快,且收敛次数固定。
- 上文也有提到过。与其他分区算法相比,如K-means。PAM对异常值的敏感性较低。
缺点:
- 因为它是通过计算每个点之间的距离而聚类的。所以它只适合呈球面的数据集。说白了就是不适合离散的数据。
- 这个算法第一次的质心选择是随机的。而且它只取实际的点。所以每次的结果可能都不一样,多少会存在误差。
现在我们已经学习了Partition聚类的两个热门算法。在实际项目中具体需要使用哪一个,这就需要大家自己衡量判断了。今天的分享就到现在为止。下期我将分享Density Based Clustering,也就是基于密度的聚类方法。
喜欢机器学习的,热爱算法的,想要一起学习这个行业的知识的。欢迎关注我的博客,以后更多原创内容会分享给大家。
点我阅读更多算法分享