在机器学习领域,聚类算法是一种常用的无监督学习方法,用于将数据集中的样本划分为若干个簇,使得同一簇内的样本尽可能相似,而不同簇之间的样本尽可能不同。K-Means 和 K-Medoids 是两种经典的聚类算法,它们都基于划分的思想,但在具体实现和应用场景上存在一些差异。
一、算法原理
1. K-Means:
-
中心点选择: K-Means 算法通过计算簇内所有样本的均值来确定中心点(centroid)。
-
距离度量: 通常使用欧氏距离来衡量样本与中心点之间的距离。
-
迭代过程: 算法通过不断迭代更新中心点和样本所属簇,直到中心点不再变化或达到最大迭代次数。
2. K-Medoids:
-
中心点选择: K-Medoids 算法从簇内选择一个实际存在的样本作为中心点(medoid)。
-
距离度量: 可以使用任意距离度量方法,例如曼哈顿距离、欧氏距离等。
-
迭代过程: 与 K-Means 类似,K-Medoids 也通过迭代更新中心点和样本所属簇,直到中心点不再变化或达到最大迭代次数。
二、异同点
特性 | K-Means | K-Medoids |
---|---|---|
中心点 | 虚拟点(均值) | 实际存在的样本点 |
距离度量 | 通常使用欧氏距离 | 可以使用任意距离度量 |
对噪声和异常值的敏感性 | 敏感 | 不敏感 |
计算复杂度 | 较低 | 较高 |
适用场景 | 大规模数据集,簇形状为凸形 | 小规模数据集,簇形状任意 |
三、适用场景
K-Means:
-
数据集规模较大,计算效率要求高。
-
簇的形状为凸形,例如球形、椭圆形等。
-
数据集中噪声和异常值较少。
K-Medoids:
-
数据集规模较小,计算效率要求不高。
-
簇的形状任意,例如非凸形、流形等。
-
数据集中存在噪声和异常值。
四、Python 代码示例
K-Means:
from sklearn.cluster import KMeans
import numpy as np
# 生成随机数据
X = np.random.rand(100, 2)
# 创建 KMeans 模型
kmeans = KMeans(n_clusters=3)
# 拟合模型
kmeans.fit(X)
# 获取聚类结果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 打印结果
print("Labels:", labels)
print("Centroids:", centroids)
K-Medoids:
from sklearn_extra.cluster import KMedoids
import numpy as np
# 生成随机数据
X = np.random.rand(100, 2)
# 创建 KMedoids 模型
kmedoids = KMedoids(n_clusters=3)
# 拟合模型
kmedoids.fit(X)
# 获取聚类结果
labels = kmedoids.labels_
medoids = kmedoids.cluster_centers_
# 打印结果
print("Labels:", labels)
print("Medoids:", medoids)
五、总结
K-Means 和 K-Medoids 都是常用的聚类算法,它们各有优缺点,适用于不同的场景。K-Means 算法计算效率高,适用于大规模数据集和凸形簇,但对噪声和异常值敏感。K-Medoids 算法对噪声和异常值不敏感,适用于小规模数据集和任意形状的簇,但计算复杂度较高。在实际应用中,需要根据具体问题选择合适的算法。