【聚类算法】K-Mediods算法详解

定义

今天我们来一起学习聚类算法的另一个算法 —— 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算法的“作案过程”。

  1. 首先确定K的值,这里很重要,决定我们要把数据聚合成多少类
  2. 输入我们想要聚类的数据
  3. 随机在数据中选择K个点作为质心
  4. 计算其他点与质心的距离,并聚合到距离紧的一类,得到簇
  5. 将簇之间每个点之间作为质心都计算一次距离,然后选择距离最小的点作为新的质心。注意这里的质心必须是确切存在的数据,和K-Means是不一样的
  6. 重复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,也就是基于密度的聚类方法。
喜欢机器学习的,热爱算法的,想要一起学习这个行业的知识的。欢迎关注我的博客,以后更多原创内容会分享给大家。
点我阅读更多算法分享

k-mediods是一种常用的聚类算法,与k-means类似,但它使用的是实际数据点中的中心点(medoids),而不是简单的平均值。以下是Python实现的基本步骤: 1. 初始化k个medoids,可以是随机选择的数据点。 2. 对于每个数据点,计算其与所有medoids之间的距离,并将其分配到最近的medoid所在的簇。 3. 对于每个簇,选择一个非medoid数据点,将其作为新的medoid,并计算新的簇分配。 4. 如果新的medoid导致更小的总距离,则接受它并更新簇分配。否则保留原来的medoid。 重复步骤3和4,直到没有更改的簇分配或达到最大迭代次数。 下面是一个简单的Python实现: ```python import random import numpy as np def kmedoids(X, k, max_iter=100): m, n = X.shape # 随机初始化medoids medoids = random.sample(range(m), k) # 初始化簇分配 clusters = np.zeros(m) for i in range(max_iter): # 更新簇分配 for j in range(m): distances = [np.linalg.norm(X[j] - X[m]) for m in medoids] cluster = np.argmin(distances) clusters[j] = cluster # 更新medoids for cluster in range(k): indices = np.where(clusters == cluster)[0] costs = [sum([np.linalg.norm(X[i] - X[j]) for j in indices]) for i in indices] new_medoid = indices[np.argmin(costs)] if medoids[cluster] != new_medoid: medoids[cluster] = new_medoid else: break else: continue break return medoids, clusters ``` 其中,X是n个m维数据点的矩阵,k是簇数,max_iter是最大迭代次数。返回medoids和clusters,分别表示medoid的索引和每个数据点所属的簇。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值