常用的聚类算法及其应用场景:
1. 基于距离/相似度的聚类
(1) K-Means聚类
-
原理:将数据划分为K个簇,使每个点到其簇中心的距离最小。
-
实现:
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3) kmeans.fit(X) labels = kmeans.labels_
(2) K-Medoids(PAM)
-
原理:类似K-Means,但使用实际数据点(medoids)作为中心,而非均值。对异常值更鲁棒
-
实现:
from sklearn_extra.cluster import KMedoids kmedoids = KMedoids(n_clusters=3) kmedoids.fit(X)
(3) 层次聚类(Hierarchical Clustering)
-
原理:自底向上(AGNES)或自顶向下(DIANA)构建树状结构。
-
适用场景:数据具有层次结构(如生物分类、文档聚类),无需预先指定簇数(可通过树状图选择)
-
实现:
from sklearn.cluster import AgglomerativeClustering agg = AgglomerativeClustering(n_clusters=3, linkage='ward') labels = agg.fit_predict(X)
2. 基于密度的聚类
(4) DBSCAN(Density-Based Spatial Clustering)
-
原理:基于密度划分簇,可发现任意形状的簇。
-
适用场景:数据分布不规则(如环形、月牙形),可自动识别噪声点(标签为
-1
) -
实现:
from sklearn.cluster import DBSCAN dbscan = DBSCAN(eps=0.5, min_samples=5) labels = dbscan.fit_predict(X)
(5) OPTICS(Ordering Points To Identify Clustering Structure)
-
原理:改进DBSCAN,适用于不同密度的簇。
-
适用场景:数据密度不均匀,比DBSCAN更灵活
-
实现:
from sklearn.cluster import OPTICS optics = OPTICS(min_samples=10, xi=0.05) labels = optics.fit_predict(X)
3. 基于分布的聚类
(6) 高斯混合模型(GMM)
-
原理:假设数据由多个高斯分布混合生成。
-
适用场景:数据符合高斯分布,如语音识别、异常检测
-
实现:
from sklearn.mixture import GaussianMixture gmm = GaussianMixture(n_components=3) gmm.fit(X) labels = gmm.predict(X)
4. 基于图的聚类
(7) 谱聚类(Spectral Clustering)
-
原理:基于图拉普拉斯矩阵进行降维后聚类。
-
适用场景:数据分布复杂(如非凸形状),适用于图像分割、社交网络分析
-
实现:
from sklearn.cluster import SpectralClustering spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors') labels = spectral.fit_predict(X)
(8) 亲和传播(Affinity Propagation)
-
原理:通过消息传递自动确定簇数。
-
适用场景:无需指定簇数,适用于中小规模数据
-
实现:
from sklearn.cluster import AffinityPropagation af = AffinityPropagation(damping=0.7) labels = af.fit_predict(X)
5. 其他聚类方法
(9) BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)
-
原理:适用于大规模数据的层次聚类。
-
适用场景:数据量较大(>10万样本),如电商用户行为分析
-
实现:
from sklearn.cluster import Birch birch = Birch(n_clusters=3) labels = birch.fit_predict(X)
(10) Mean Shift(均值漂移)
-
原理:基于密度峰值寻找簇中心。
-
适用场景:簇数未知,如计算机视觉中的目标跟踪
-
实现:
from sklearn.cluster import MeanShift ms = MeanShift(bandwidth=2) labels = ms.fit_predict(X)
总结:
聚类结果可通过以下指标评估:
from sklearn.metrics import silhouette_score, calinski_harabasz_score# 轮廓系数(-1~1,越大越好)
silhouette = silhouette_score(X, labels)# Calinski-Harabasz指数(越大越好)
ch_score = calinski_harabasz_score(X, labels)
如何选择合适的聚类算法?
数据类型 | 推荐算法 | 示例场景 |
---|---|---|
数值型、球形分布 | K-Means, GMM | 客户分群, 图像压缩 |
非球形分布 | DBSCAN, 谱聚类 | 异常检测, 社交网络分析 |
层次结构数据 | 层次聚类, BIRCH | 生物分类, 文档聚类 |
自动确定簇数 | Affinity Propagation, MeanShift | 图像分割, 目标跟踪 |
大规模数据 | BIRCH, Mini-Batch K-Means | 电商用户行为分析 |
scikit-learn
库提供了绝大多数聚类算法的实现,选择时需结合数据特点和业务需求。