聚类(Clustering)作为无监督学习的核心方法,无需依赖标签信息,通过衡量数据样本之间的相似性将其划分为若干簇,使得同一簇内样本高度相似,不同簇间差异显著。常见算法包括基于划分的K-Means、基于层次的层次聚类以及基于密度的DBSCAN、OPTICS等。聚类广泛应用于用户分群、市场细分、文本主题发现、图像分割等场景,是数据挖掘与探索性分析的重要工具。
什么是层次聚类
在聚类分析中,层次聚类(Hierarchical Clustering)是一种直观且应用广泛的方法,常用于文本主题发现、基因表达模式识别、社会网络群体挖掘、图像处理及市场细分等任务。与K-Means等划分式方法不同,层次聚类通过构建样本间的层次关系,生成一棵聚类树(dendrogram),从而揭示数据的多层次结构。
层次聚类的核心思想是:
- 自底向上(凝聚型,Agglomerative):初始将每个样本视为独立簇,逐步合并最相似的簇,直至形成单一簇或达到预设簇数。
- 自顶向下(分裂型,Divisive):初始将所有样本视为一个整体,逐步分裂为更小的簇,直至达到指定簇数。
实际应用中,凝聚型层次聚类更为常用,因其计算效率高且结果直观。
层次聚类的效果高度依赖于簇间距离度量方式,不同度量方法会带来不同的聚类结果:
- 单链法(Single Linkage):取簇间最短距离,易产生链式效应。
- 全链法(Complete Linkage):取簇间最长距离,倾向于形成紧凑簇。
- 平均链法(Average Linkage):取簇间平均距离,平衡单链与全链特性。
- Ward 方法:基于平方误差最小化,倾向于生成方差小且大小均匀的簇。
以凝聚型层次聚类为例,算法的工作步骤如下:
- 将每个样本视为独立簇。
- 计算所有簇间距离。
- 合并最近的两个簇。
- 更新簇间距离矩阵。
- 重复步骤2-4,直到所有样本合并为一个簇或达到预设簇数。
这个过程与二分法或归并排序有相似之处。
最终结果可以用树状图(dendrogram)直观展示,每个分支的高度代表簇之间的距离。
下面用一段代码形象地理解一下:
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
# 1. 加载数据
iris = load_iris()
X = iris.data
# 2. 层次聚类 (AgglomerativeClustering)
model = AgglomerativeClustering(n_clusters=3, linkage='ward')
labels = model.fit_predict(X)
print("聚类结果:", labels[:20])
# 3. 绘制树状图
Z = linkage(X, method='ward')
plt.figure(figsize=(8, 5))
dendrogram(Z, truncate_mode='level', p=3)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()
输出结果如下:
从结果可以看出,首次聚类时第7个样本与第8个样本距离最近,它们首先合并为一个簇,随后簇间不断合并,直至达到预设的目标类别数。
层次聚类的优势在于无需预先指定簇数,能够揭示数据的多层次结构,且可视化结果直观。但其计算复杂度较高,难以扩展到超大规模数据集,同时对噪声和异常值敏感。尽管如此,在小规模数据分析、模式探索及数据可视化场景中,层次聚类依然是一种非常有价值的方法。
密度聚类方法
密度聚类方法通过寻找数据空间中高密度区域来划分簇,能够自然地处理噪声和非凸形簇结构,这是传统划分式方法难以解决的问题。例如,在地图中搜索美食热点区域或人口事件聚集区,均可通过密度聚类实现。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)和OPTICS(Ordering Points To Identify the Clustering Structure)是两种典型的密度聚类方法。
1. DBSCAN
DBSCAN的核心思想是:簇是由密度可达的点组成的区域,低密度区域视为噪声。
- 核心概念:
- ε-邻域:样本点周围半径为ε的区域。
- 核心点:其ε-邻域内点数 ≥ minPts。
- 边界点:位于核心点ε-邻域内,但本身点数 < minPts。
- 噪声点:不属于任何簇的点。
- 聚类规则:
- 从任意未访问点开始,若其为核心点,则以该点为中心扩展簇,将密度可达的点加入簇。
- 对簇中新增的核心点重复扩展过程,直到簇无法再扩展。
- 重复以上步骤,直到所有点都被访问过。
DBSCAN能够发现任意形状的簇,自动识别噪声点,且无需预设簇数。但其对参数ε和minPts较为敏感,在高维数据中效果会下降,因为高维空间中的密度概念会失效。
2. OPTICS
OPTICS是DBSCAN的改进,主要解决DBSCAN在参数选择(尤其是ε)上的限制。
- 核心思想:不直接生成簇,而是生成可达距离序列(reachability distance),记录点之间的密度结构。
- 聚类规则:
- 对每个点计算核心距离(core distance)和可达距离(reachability distance);
- 按可达距离顺序访问所有点,形成一个有序列表;
- 通过可达距离的突变检测不同密度区域,从而识别簇。
OPTICS能发现不同密度的簇,无需严格指定ε值,适合数据密度不均匀的场景。但其计算复杂度高于DBSCAN,结果需要进一步分析才能确定簇边界。
下面用代码展示一下这两种方法的效果对比:
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
from sklearn.cluster import OPTICS
import matplotlib.pyplot as plt
# 生成非凸形数据
X, y = make_moons(n_samples=300, noise=0.05, random_state=42)
# DBSCAN 聚类
dbscan = DBSCAN(eps=0.2, min_samples=5)
labels_dbscan = dbscan.fit_predict(X)
# OPTICS 聚类
optics = OPTICS(min_samples=5, xi=0.05, min_cluster_size=0.1)
labels_optics = optics.fit_predict(X)
# 可视化 DBSCAN
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.scatter(X[:,0], X[:,1], c=labels_dbscan, cmap='viridis', s=30)
plt.title("DBSCAN Clustering")
# 可视化 OPTICS
plt.subplot(1,2,2)
plt.scatter(X[:,0], X[:,1], c=labels_optics, cmap='viridis', s=30)
plt.title("OPTICS Clustering")
plt.show()
运行结果如下,可以看到DBSCAN和OPTICS都能识别非凸簇,OPTICS对不同密度簇表现更稳健。
总结时刻到,DBSCAN和OPTICS是密度聚类的代表方法:
- DBSCAN简单高效,适合簇密度均匀、噪声点明确的数据;
- OPTICS解决了DBSCAN对参数敏感的问题,能处理不同密度的簇,但计算复杂度更高。
总体而言,密度聚类方法在非球形簇、异常点检测和探索性数据分析中具有明显优势,是传统划分聚类方法的重要补充。
