机器学习中带有已解决示例的 K-Medoids 聚类
简介
K-Medoids 是一种使用聚类分区方法的无监督聚类算法。它是 K-Means 聚类算法的改进版本,特别用于处理异常数据。它需要未标记的数据才能使用。
在本文中,让我们通过示例了解 k-Medoids 算法。
K-Medoids 算法
在 K-Medoids 算法中,每个数据点称为中心点。中心点充当聚类中心。中心点是一个点,它与同一聚类中所有其他点的距离总和最小。对于距离,可以使用任何合适的度量,如欧几里得距离或曼哈顿距离。
应用算法后,完整数据被分为 K 个簇。
K-Medoids 有三种类型 - PAM、CLARA 和 CLARANS。 PAM 是最流行的方法。它有一个缺点,就是需要花费大量时间。
K-Medoid 的应用方式是
一个点只能属于一个簇
每个簇至少有一个点
让我们通过一个例子来了解 K-Medoids 的工作过程。
工作
最初,我们将 K 作为簇数,将 D 作为未标记数据。
首先,我们从数据集中选择 K 个点,并将它们分配给 K 个簇。这 K 个点充当初始中心点。每个对象都被放入一个簇中。
接下来,使用欧几里得距离或曼哈顿距离等距离度量来计算初始中心点(点)与其他点(非中心点)之间的距离。等。
非中心点被分配到与中心点距离最小的特定簇中。
现在计算总成本,即簇内其他点到中心点的距离之和。
接下来,选择一个随机的新非中心点对象 s 并将其与初始中心点对象 r 交换,然后重新计算成本。
如果成本 < costr ,则交换变为永久性的。
最后,重复步骤 2 到 6,直到成本不再变化。
示例
让我们考虑以下数据集。我们将取 k=2 和要使用的距离公式
$$\mathrm{D=\mid x_{2}-x_{1}\mid+\mid y_{2}-y_{1}\mid}$$
Sl. no |
x |
y |
---|---|---|
1 |
9 |
6 |
2 |
10 |
4 |
3 |
4 |
4 |
4 |
5 |
8 |
5 |
3 |
8 |
6 |
2 |
5 |
7 |
8 |
5 |
8 |
4 |
6 |
9 |
8 |
4 |
10 |
9 |
3 |
数据在绘图时看起来与下图类似。
对于 k = 2,我们取两个随机点 P1(8,4) 和 P2(4,6),并计算它们与其他点的距离。
Sl. no |
x |
y |
Dist from P1 (8,4) |
Dist from P2 (4,6) |
---|---|---|---|---|
1 |
9 |
6 |
3 |
5 |
2 |
10 |
4 |
2 |
8 |
3 |
4 |
4 |
4 |
2 |
4 |
5 |
8 |
7 |
3 |
5 |
3 |
8 |
9 |
3 |
6 |
2 |
5 |
7 |
3 |
7 |
8 |
5 |
1 |
5 |
8 |
4 |
6 |
- |
- |
9 |
8 |
4 |
- |
- |
10 |
9 |
3 |
2 |
8 |
1,2,7,10 - 分配给 P1(8,4)
3,4,5,6 - 分配给 P2(4,6)
总成本 C1 = (3+2+1+2) +(2+3+3+3) = 19
现在让我们随机选择其他两个点作为中心点 P1(8,5) 和 P2(4,6),并计算距离。
Sl. no |
x |
y |
Dist from P1(8,5) |
Dist from P2(4,6) |
---|---|---|---|---|
1 |
9 |
6 |
2 |
5 |
2 |
10 |
4 |
3 |
8 |
3 |
4 |
4 |
5 |
2 |
4 |
5 |
8 |
6 |
3 |
5 |
3 |
8 |
6 |
3 |
6 |
2 |
5 |
6 |
3 |
7 |
8 |
5 |
- |
- |
8 |
4 |
6 |
- |
- |
9 |
8 |
4 |
1 |
- |
10 |
9 |
3 |
3 |
8 |
$$\mathrm{涉及的新成本\:C_{2}=[2+3+1+3]+[2+3+3+3]=20}$$
$$\mathrm{涉及交换 C 的总成本\:=C_{2}-C_{1}=20-19=1}$$
由于交换 C 的总成本大于 0,我们确实会恢复交换。
点 P1(8,4) 和 P2(4,6) 被视为最终的中心点,仅使用这些点形成 2 个簇。
代码实现
import numpy as np from sklearn_extra.cluster import KMedoids data = {'x' : [9,10,4,5,3,2,8,4,8,9], 'y' : [6,4,4,8,8,5,5,6,4,3]} x = [[i,j] for i,j in zip(data['x'],data['y'])] data_x = np.asarray(x) model_km = KMedoids(n_clusters=2) km = model_km.fit(data_x) print("标签 :",km.labels_) print("聚类中心 :",km.cluster_centers_)
输出
标签 : [1 1 0 0 0 0 1 0 1 1] 聚类中心 : [[4. 6.] [8. 4.]]
结论
K-Medoids 是 M-Means 算法的一种改进方法。它是无监督的,需要未标记的数据。K-Mediods 是一种基于距离的方法,它依赖于聚类距离和聚类内距离,其中 medoids 充当聚类中心并作为计算距离的参考点。它非常有用,因为它可以非常有效地处理异常值。