11.1 经典聚类算法
Scikit-learn经典聚类算法教程:K-Means、DBSCAN、层次聚类与GMM
本教程详细讲解Scikit-learn中的经典聚类算法,包括K-Means聚类、层次聚类、密度聚类DBSCAN和高斯混合模型GMM。内容简单易懂,涵盖k值选择、距离度量等关键参数,适合机器学习新手学习。
推荐工具
Scikit-learn经典聚类算法详解
聚类是机器学习中的无监督学习方法,用于将数据点分组为相似类别。Scikit-learn提供了多种经典聚类算法,本教程将介绍K-Means、层次聚类、DBSCAN和高斯混合模型(GMM),帮助新人快速上手。
1. K-Means聚类
K-Means是最常用的聚类算法之一,通过迭代分配数据点到最近的质心(簇中心)来形成簇。
关键概念
- k值选择:确定簇的数量。常见方法包括:
- 肘部法则:绘制不同k值下的失真(inertia)曲线,选择拐点对应的k值。
- 轮廓系数:计算每个数据点的轮廓分数,分数越高表示聚类效果越好。
- 初始质心:质心初始化可能影响结果。Scikit-learn默认使用k-means++方法以改善收敛。
Scikit-learn实现示例
from sklearn.cluster import KMeans
import numpy as np
# 示例数据
X = np.random.rand(100, 2) # 100个二维数据点
# 使用K-Means
kmeans = KMeans(n_clusters=3, random_state=42) # 设置k=3
kmeans.fit(X)
labels = kmeans.labels_ # 聚类标签
centroids = kmeans.cluster_centers_ # 质心
2. 层次聚类
层次聚类通过逐步合并或分裂数据点来构建树状结构(树状图),适合探索数据层次关系。
主要类型
- 凝聚式(Agglomerative):从单个数据点开始,逐步合并最相似的簇。
- 分裂式(Divisive):从整个数据集开始,逐步分裂为更小的簇。Scikit-learn主要支持凝聚式聚类。
距离度量
- 在合并簇时,使用不同距离度量如欧氏距离、曼哈顿距离或cosine相似度。Scikit-learn通过
linkage参数控制。
Scikit-learn实现示例
from sklearn.cluster import AgglomerativeClustering
# 使用凝聚式层次聚类
agg_clustering = AgglomerativeClustering(n_clusters=3, linkage='ward') # ward连接基于方差最小化
labels = agg_clustering.fit_predict(X)
3. 密度聚类:DBSCAN
DBSCAN基于数据点的密度分布来发现簇,能自动识别任意形状的簇并有效处理噪声点。
核心思想
- 核心点:在指定半径(eps)内拥有足够邻居(min_samples)的点。
- 边界点:在核心点邻域内但本身不满足核心点条件的点。
- 噪声点:不属于任何簇的点。
优势
- 无需预先指定簇数量(如K-Means中的k值)。
- 对噪声鲁棒,适合处理异常值。
Scikit-learn实现示例
from sklearn.cluster import DBSCAN
# 使用DBSCAN
dbscan = DBSCAN(eps=0.3, min_samples=5) # eps为邻域半径,min_samples为最小邻居数
labels = dbscan.fit_predict(X)
4. 高斯混合模型(GMM)
GMM是一种概率聚类方法,假设数据由多个高斯分布混合生成,适合数据服从高斯分布的场景。
特点
- 概率分配:每个数据点属于每个簇的概率,而不是硬分配标签。
- 灵活建模:能捕捉簇的形状和大小差异。
Scikit-learn实现示例
from sklearn.mixture import GaussianMixture
# 使用GMM
gmm = GaussianMixture(n_components=3, random_state=42) # n_components指定高斯分布数量
gmm.fit(X)
labels = gmm.predict(X) # 预测簇标签
probabilities = gmm.predict_proba(X) # 获取概率分布
5. 算法比较与总结
| 算法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| K-Means | 数据球形分布,簇大小均匀 | 简单高效,易于实现 | 对初始质心敏感,需指定k值 |
| 层次聚类 | 数据层次结构明显 | 可视化树状图,无需指定k值 | 计算复杂度高,不适合大数据集 |
| DBSCAN | 任意形状簇,噪声数据 | 抗噪声,自动发现簇数量 | 对参数eps和min_samples敏感 |
| GMM | 数据服从高斯分布 | 概率模型,能处理软聚类 | 假设数据高斯分布,可能过拟合 |
实用建议
- 对于新手,从K-Means开始,通过肘部法则或轮廓系数选择k值。
- 探索数据形状时,尝试DBSCAN或层次聚类。
- 处理概率性数据时,使用GMM。
通过学习这些算法,你可以在Scikit-learn中灵活应用聚类分析来解决实际问题。练习时,建议使用内置数据集(如sklearn.datasets.make_blobs)进行实验。
开发工具推荐