K-Medoids聚类方法和K-Means有什么区别?

47 阅读5分钟

推荐直接网站在线阅读:aicoting AI算法面试学习在线网站

所有相关源码示例、流程图、模型配置与知识库构建技巧,我也将持续更新在Github:AIHub,欢迎关注收藏!

什么是聚类?

聚类(Clustering)是一种典型的无监督学习方法,其目标是在没有标签信息的情况下,将数据样本按照相似性划分为若干簇,使得同一簇内的样本相似度高,不同簇之间差异显著。常见方法包括基于划分的 K-Means、基于层次的 层次聚类、以及基于密度的 DBSCAN、OPTICS 等。聚类广泛应用于用户分群、市场细分、文本主题发现、图像分割等任务,是数据挖掘和探索性分析中的重要工具。

K-Means 聚类

K-Means 是最经典的聚类算法之一,属于基于划分(Partition-based)的聚类方法。它通过迭代优化目标函数,将数据划分为 K 个簇,使得同簇内样本之间相似度最大化,而不同簇之间相似度最小化。一个簇说白了就是一组相同类别的东西,只是在这个方法里起了个名字叫簇,比如苹果,香蕉,橘子属于水果那一簇,彭于晏,刘亦菲和你们属于帅哥美女那一簇。由于其简单、高效,K-Means 在数据挖掘、文本分析、图像分割等领域被广泛应用。

K-Means 的目标是最小化簇内平方误差(Within-Cluster Sum of Squares, WCSS),即:

J=i=1KxCixμi2J = \sum_{i=1}^{K} \sum_{x \in C_i} \| x - \mu_i \|^2

其中:

  • KK :簇的个数
  • CiC_i :第 ii 个簇
  • μiμ_i :簇 CiC_i 的质心(均值向量)
  • xμi2\| x - \mu_i \|^2 :样本点与簇中心的欧式距离 K-Means的核心思想就是不断更新簇划分与质心,直到收敛(目标函数不再显著下降)。

K-Means的算法流程也很容易理解:

  1. 初始化:随机选择 K 个样本作为初始质心。
  2. 分配样本:将每个样本分配到距离最近的簇中心。
  3. 更新质心:对每个簇,计算所有样本的均值作为新的质心。
  4. 迭代:重复步骤 2-3,直到簇划分不再变化或目标函数收敛。

下面基于Scikit-learn编写一段示例代码让咱们更好的理解一下:

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 1. 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)

# 2. 训练 K-Means
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
y_pred = kmeans.fit_predict(X)

# 3. 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=30, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
            c='red', marker='X', s=200, label='Centroids')
plt.legend()
plt.title("K-Means Clustering")
plt.show()

运行结果如下,不同颜色表示不同簇,红色 X 为聚类中心。

总结环节!K-Means 作为经典的无监督学习方法,凭借其高效性和直观性,成为最常用的聚类算法之一。但在实际应用中,需要注意簇数选择、初始点敏感性以及对复杂分布的适用性问题。针对这些不足,研究者提出了 K-Means++、Mini-Batch K-Means 等改进方法,使其在大规模机器学习任务中依然具有重要地位。

K-Medoids 聚类

K-Medoids(又称 PAM,Partitioning Around Medoids)是一种基于划分的聚类方法,与 K-Means 类似,但它使用数据集中真实存在的点作为簇中心(称为“Medoid”),而不是均值向量。这使得 K-Medoids 对 异常值和噪声更加鲁棒,适合处理非欧式距离或离散型数据。

K-Medoids 的目标函数是最小化样本与所属簇中心的距离和:

J=i=1KxCid(x,mi)J = \sum_{i=1}^{K} \sum_{x \in C_i} d(x, m_i)

其中:

  • KK:簇的个数
  • CiC_i:第ii 个簇
  • mim_iCiC_i 的的中心(medoid,即簇中某个实际点)
  • d(x,mi)d(x, m_i)样本点与簇中心 之间的距离(可以是欧式距离、曼哈顿距离,甚至非向量空间距离)

与 K-Means 的主要区别是:

  • K-Means 的中心是 簇内均值,可能不属于数据集;
  • K-Medoids 的中心是 真实样本点,因此对噪声更稳健。

K-Medoids 最经典的实现是 PAM(Partitioning Around Medoids),流程如下:

  1. 初始化:随机选择 K 个点作为初始 medoid。
  2. 分配样本:将每个样本分配给距离最近的 medoid。
  3. 更新 medoid:
  • 对于每个簇,尝试用簇中其他点替换当前 medoid;

  • 计算代价函数变化,如果代价减少,则更新 medoid。

  1. 迭代:重复步骤 2-3,直到 medoid 不再变化或代价函数收敛。 PAM 的计算复杂度较高,约为 O(k(nk)2)O(k \cdot (n-k)^2),因此在大规模数据集上常用 CLARA(Clustering Large Applications) 或 CLARANS 进行加速。

下面基于Scikit-learn-extra编写了一段示例代码:

from sklearn.datasets import make_blobs
from sklearn_extra.cluster import KMedoids
import matplotlib.pyplot as plt

# 1. 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)

# 2. 训练 K-Medoids
kmedoids = KMedoids(n_clusters=4, random_state=42, metric='euclidean')
y_pred = kmedoids.fit_predict(X)

# 3. 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=30, cmap='viridis')
plt.scatter(kmedoids.cluster_centers_[:, 0], kmedoids.cluster_centers_[:, 1],
            c='red', marker='X', s=200, label='Medoids')
plt.legend()
plt.title("K-Medoids Clustering")
plt.show()

运行结果如下,其中不同颜色表示不同簇,红色 X 为 medoid。

K-Medoids 是 K-Means 的一种稳健变体,适合在存在噪声、异常点或非欧式距离情况下使用。它的 优势 在于簇中心是实际样本点,结果更具可解释性,同时对异常值和噪声更鲁棒,并且可用于任意距离度量,不局限于欧式空间。但它计算复杂度较高,不适合大规模数据,并且对簇形状仍有一定假设,不适合处理复杂非凸簇。

在实践中,K-Medoids 更适合小规模、高质量数据集,或对稳健性有较高要求的任务,而在大规模场景中往往结合 CLARA/CLARANS 进行优化。

最新的文章都在公众号aicoting更新,别忘记关注哦!!!