【有啥问啥】关于聚类算法(Clustering):你想要了解的都在这里

Clustering

关于聚类算法(Clustering):你想要了解的都在这里

聚类算法概述

聚类是一种无监督学习方法,旨在根据数据点的相似性将其划分为多个组(簇)。与分类任务不同,聚类不依赖于预先标记的数据集,而是根据数据本身的特征进行分组。聚类算法广泛应用于图像处理、文本分析、市场细分、生物信息学等领域,帮助我们发现数据中的潜在结构和模式。

举个栗子

假设你是一名图书管理员,负责将大量书籍分类整理。书籍既没有明确的类别标签,也没有事先分好类的目录。你面前的任务是根据书籍的内容、作者、封面风格等特征,将这些书籍分成几类,比如小说、历史、科学等。

在你手头上有一本书后,你需要决定这本书应该放在哪一类。这时候,你可能会做以下几件事情:

  1. 观察书籍的特征:比如书的封面颜色、标题、作者、内容简介等。
  2. 根据相似性分组:将内容相似的书放在一起。例如,所有关于历史的书放在同一类,而所有科幻小说放在另一类。
  3. 调整分组:随着你处理的书越来越多,你可能会发现某些书应该移到另一个组,或者某个组可以再细分成多个更小的组。

这就是聚类算法的核心思想:根据数据的特征,将相似的数据点分成组,而这些组就是所谓的“簇”。在实际应用中,我们通常不会手动去观察和分类,而是依靠算法根据数据的相似性自动完成这些任务。

在选择聚类算法时,需要考虑数据的特性、算法的计算复杂度,以及目标应用的需求。不同的聚类算法在处理簇的形状、规模和分布上表现各异,因此理解这些算法的工作原理和应用场景是至关重要的。接下来,我们将详细介绍几种常见的聚类算法,包括K-means、层次聚类、DBSCAN、谱聚类、高斯混合模型(GMM)和亲和力传播。

1. K-均值聚类(K-means Clustering)

工作原理

K-均值聚类通过迭代优化簇内点与簇中心的距离,最终得到K个簇。算法的步骤如下:

  1. 初始化:随机选择K个点作为初始聚类中心。
  2. 分配数据点:根据欧氏距离等度量方法,将每个数据点分配到最近的聚类中心。
  3. 更新聚类中心:计算每个簇内所有点的均值,并将其作为新的聚类中心。
  4. 重复:上述步骤重复进行,直到聚类中心不再发生显著变化或达到预设迭代次数。

数学公式

K-均值算法的目标是最小化以下代价函数:

J = ∑ i = 1 K ∑ x ∈ C i ∥ x − μ i ∥ 2 J = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2 J=i=1KxCixμi2

其中, C i C_i Ci 是第 i i i 个簇的集合, μ i \mu_i μi 是第 i i i 个簇的中心, ∥ x − μ i ∥ \|x - \mu_i\| xμi 是数据点 x x x 到簇中心 μ i \mu_i μi 的距离(通常使用欧氏距离)。

Python代码示例

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 生成数据集
X = np.random.rand(100, 2)

# K-means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red')
plt.show()

优缺点

  • 优点
    • 算法简单且计算速度快,尤其适合大数据集。
    • 算法在簇呈现均匀、球形分布时效果较好。
  • 缺点
    • 需要预先指定K值,可能难以确定。
    • 对初始聚类中心的选择敏感,可能导致不同的聚类结果。
    • 不能有效处理非球形簇,易受噪声和异常值影响。

应用场景

K-means常用于分布较为均匀且簇大小相似的数据集。实际应用包括客户细分、市场营销中的用户分类、图像分割等。在这些场景中,数据通常可以自然地分为多个组,且每组内部相似性较高。

2. 层次聚类(Hierarchical Clustering)

工作原理

层次聚类分为凝聚层次聚类和分裂层次聚类。凝聚层次聚类从每个点作为单独的簇开始,逐步合并相似的簇,直到所有点形成一个簇或达到某个停止条件;而分裂层次聚类则从一个簇开始,逐步分裂成更小的簇。

数学公式

凝聚层次聚类的核心是计算簇之间的距离,常用的距离度量包括:

  • 最小距离(单链接,Single Linkage)
    D min ( C i , C j ) = min ⁡ x ∈ C i , y ∈ C j ∥ x − y ∥ D_{\text{min}}(C_i, C_j) = \min_{x \in C_i, y \in C_j} \|x - y\| Dmin(Ci,Cj)=xCi,yCjminxy
  • 最大距离(全链接,Complete Linkage)
    D max ( C i , C j ) = max ⁡ x ∈ C i , y ∈ C j ∥ x − y ∥ D_{\text{max}}(C_i, C_j) = \max_{x \in C_i, y \in C_j} \|x - y\| Dmax(Ci,Cj)=xCi,yCjmaxxy
  • 平均距离(平均链接,Average Linkage)
    D avg ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ y ∈ C j ∥ x − y ∥ D_{\text{avg}}(C_i, C_j) = \frac{1}{|C_i||C_j|} \sum_{x \in C_i} \sum_{y \in C_j} \|x - y\| Davg(Ci,Cj)=Ci∣∣Cj1xCiyCjxy

Python代码示例

from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

# 生成数据集
X = np.random.rand(50, 2)

# 层次聚类
Z = linkage(X, 'ward')

# 绘制树状图
dendrogram(Z)
plt.show()

优缺点

  • 优点
    • 不需要预先指定簇的数量。
    • 能够发现任何形状的簇,适应性强。
  • 缺点
    • 计算复杂度高,特别是对于大数据集。
    • 聚类结果依赖于合并或分裂策略的选择,可能不是全局最优。

应用场景

层次聚类适用于分析不确定簇数量或簇大小多样的数据集。例如,生物信息学中的基因表达分析、社交网络中社区结构分析等。其层次化的结果也便于可视化和解释。

3. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

工作原理

DBSCAN根据数据点的密度进行聚类。算法通过定义一个ε-邻域和最小点数MinPts来识别密度核心点,并根据密度可达性将这些核心点连接成簇。与传统的基于距离的聚类算法不同,DBSCAN能够识别任意形状的簇,并有效处理噪声点。

数学公式

DBSCAN聚类的关键在于定义密度可达性:

  • ε-邻域:对于一个点 p p p,定义半径为 ε ε ε 的邻域 N ( p ) N(p) N(p) 包含所有与 p p p 的距离小于 ε ε ε 的点。
  • 密度可达性:如果点 p p p 在点 q q q 的ε-邻域内且 q q q 是密度核心点,那么 p p p 被认为是密度可达的。

Python代码示例

from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt

# 生成数据集
X = np.random.rand(100, 2)

# DBSCAN聚类
dbscan = DBSCAN(eps=0.1, min_samples=5)
labels = dbscan.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.show()

优缺点

  • 优点
    • 能够识别任意形状的簇,不依赖于球形假设。
    • 对噪声和异常值具有鲁棒性。
  • 缺点
    • 需要选择合适的ε和MinPts参数,选择不当可能导致聚类效果不佳。
    • 在高维数据中,ε-邻域的选择变得更加困难。

应用场景

DBSCAN在地理空间数据分析、图像处理以及社交网络分析中表现突出。例如,地理信息系统中用于检测异常区域或热点区域,或在社交网络中检测社区结构。

4. 谱聚类(Spectral Clustering)

工作原理

谱聚类利用图论中的拉普拉斯矩阵进行

数据嵌入,通过在低维空间中执行K-means等算法来完成聚类。它特别适用于处理复杂形状的簇。

数学公式

谱聚类的关键是构建图的拉普拉斯矩阵:

L = D − W L = D - W L=DW

其中, L L L 是拉普拉斯矩阵; D D D 是度矩阵,对角线上元素 d i i d_{ii} dii 是数据点的度数; W W W 是相似度矩阵,其元素 w i j w_{ij} wij 表示点 i i i 和点 j j j 之间的相似度。

谱聚类通过求解以下特征值问题:
L v = λ v L \mathbf{v} = \lambda \mathbf{v} Lv=λv
选择前 k k k 个最小的非零特征值对应的特征向量作为数据的嵌入表示。

Python代码示例

from sklearn.cluster import SpectralClustering
import numpy as np
import matplotlib.pyplot as plt

# 生成数据集
X = np.random.rand(100, 2)

# 谱聚类
spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors')
labels = spectral.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.show()

优缺点

  • 优点
    • 能够有效处理复杂形状的簇。
    • 不受噪声和异常值的影响。
  • 缺点
    • 计算复杂度高,尤其是在大规模数据集上。
    • 构建相似度矩阵时需要选择合适的参数(如邻居数或高斯核的带宽)。

应用场景

谱聚类适用于社交网络分析、图像分割和文档聚类等领域。在这些应用中,数据往往呈现复杂的结构或高维空间的稀疏性,谱聚类能够有效处理这些挑战。

5. 高斯混合模型(Gaussian Mixture Model, GMM)

工作原理

高斯混合模型是一种概率模型,假设数据点是由多个高斯分布混合生成的。与K-means不同,GMM考虑了每个簇的概率分布,从而可以处理簇的形状、大小和密度不均匀的情况。算法通过期望最大化(EM)算法迭代更新参数,直到模型收敛。

数学公式

GMM的目标是最大化以下对数似然函数:
log ⁡ L ( θ ) = ∑ i = 1 n log ⁡ ( ∑ j = 1 k π j N ( x i ∣ μ j , Σ j ) ) \log L(\theta) = \sum_{i=1}^{n} \log \left( \sum_{j=1}^{k} \pi_j \mathcal{N}(x_i|\mu_j, \Sigma_j) \right) logL(θ)=i=1nlog(j=1kπjN(xiμj,Σj))
其中, π j \pi_j πj 是第 j j j 个高斯分布的混合系数,   N ( x i ∣ μ j , Σ j ) \mathcal\ N(x_i|\mu_j, \Sigma_j)  N(xiμj,Σj) 是数据点 x i x_i xi 在第 j j j 个高斯分布上的概率密度函数。

Python代码示例

from sklearn.mixture import GaussianMixture
import numpy as np
import matplotlib.pyplot as plt

# 生成数据集
X = np.random.rand(100, 2)

# 高斯混合模型
gmm = GaussianMixture(n_components=3, covariance_type='full')
gmm.fit(X)
labels = gmm.predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.show()

优缺点

  • 优点
    • 可以处理簇的形状、大小和密度不均匀的情况。
    • 提供了簇归属的概率估计,使得聚类更加灵活。
  • 缺点
    • 对初始参数敏感,可能陷入局部最优。
    • 计算复杂度较高,尤其是在高维数据中。

应用场景

GMM在模式识别、语音识别、图像处理等领域有广泛应用。例如,在语音识别中,GMM用于建模语音信号的特征分布,从而实现对不同语音的分类。

6. 亲和力传播(Affinity Propagation)

工作原理

亲和力传播是一种基于消息传递的聚类算法,不需要预先指定簇的数量。算法通过将数据点作为“候选中心”进行相互通信,逐步选择出最合适的簇中心并分配数据点。

数学公式

亲和力传播通过两个关键矩阵实现:

  • 责任矩阵 R ( i , k ) R(i, k) R(i,k):表示数据点 i i i 认为点 k k k 作为簇中心的适合度。
  • 可用性矩阵 A ( i , k ) A(i, k) A(i,k):表示点 k k k 作为簇中心对点 i i i 的吸引力。

更新公式为:
R ( i , k ) = s ( i , k ) − max ⁡ k ′ ≠ k { A ( i , k ′ ) + s ( i , k ′ ) } R(i, k) = s(i, k) - \max_{k' \neq k} \{A(i, k') + s(i, k')\} R(i,k)=s(i,k)k=kmax{A(i,k)+s(i,k)}
A ( i , k ) = min ⁡ { 0 , R ( k , k ) + ∑ i ′ ≠ i , i ′ ≠ k max ⁡ ( 0 , R ( i ′ , k ) ) } A(i, k) = \min\{0, R(k, k) + \sum_{i' \neq i, i' \neq k} \max(0, R(i', k))\} A(i,k)=min{0,R(k,k)+i=i,i=kmax(0,R(i,k))}
其中, s ( i , k ) s(i, k) s(i,k) 是点 i i i 和点 k k k 之间的相似度。

Python代码示例

from sklearn.cluster import AffinityPropagation
import numpy as np
import matplotlib.pyplot as plt

# 生成数据集
X = np.random.rand(100, 2)

# 亲和力传播聚类
affprop = AffinityPropagation(random_state=42)
labels = affprop.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.show()

优缺点

  • 优点
    • 不需要预先指定簇的数量,自动选择簇中心。
    • 适用于处理复杂的相似性结构。
  • 缺点
    • 对相似度矩阵的定义敏感,可能导致不稳定的聚类结果。
    • 计算复杂度较高,尤其在大数据集上。

应用场景

亲和力传播适用于图像分类、文档分类和生物信息学中的基因表达分析等。在这些领域中,数据的相似性结构往往复杂,且簇的数量难以预先确定,亲和力传播提供了灵活的聚类解决方案。


这篇文章通过通俗易懂的案例介绍了聚类算法的基本概念,并深入解析了几种常见的聚类算法,包括K-means、层次聚类、DBSCAN、谱聚类、高斯混合模型和亲和力传播。每种算法都有各自的优缺点和适用场景,选择合适的算法取决于数据的特性和具体的应用需求。希望这篇文章能帮助你更好地理解和应用聚类算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有啥问啥

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值