聚类(Clustering) 是一种无监督学习技术,用于将数据集分组,使得同一组内的样本彼此之间尽可能相似,而不同组之间的样本尽可能不同。聚类用于探索数据的内在结构和模式,广泛应用于数据分析、图像处理、市场分析等领域。
常见的聚类算法
-
K-means 聚类
-
原理:K-means 聚类算法通过迭代来最小化每个样本到其所属簇的中心点的距离总和。算法步骤如下:
- 随机选择 K 个初始簇心。
- 将每个样本分配到最近的簇心。
- 计算每个簇的新的簇心。
- 重复步骤 2 和 3,直到簇心不再变化或达到最大迭代次数。
-
优点:简单易懂、计算效率高。
-
缺点:需要预先指定簇的数量 K,对初始簇心敏感,可能会陷入局部最优解。
from sklearn.cluster import KMeans # 假设 X 是数据集 kmeans = KMeans(n_clusters=3) kmeans.fit(X) labels = kmeans.labels_ # 获取每个样本的簇标签
-
-
层次聚类(Hierarchical Clustering)
-
原理:层次聚类创建一个树状结构(树形图),可以是自底向上的凝聚方法(agglomerative clustering)或自顶向下的分裂方法(divisive clustering)。每次合并或分裂簇,直到达到预定的停止条件(如指定的簇数量)。
-
优点:不需要预先指定簇的数量,能够产生簇的层次结构。
-
缺点:计算复杂度高,不适合处理非常大的数据集。
from sklearn.cluster import AgglomerativeClustering # 假设 X 是数据集 hierarchical = AgglomerativeClustering(n_clusters=3) labels = hierarchical.fit_predict(X) # 获取每个样本的簇标签
-
-
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
-
原理:DBSCAN 聚类算法基于密度的概念,将密度相连的点分为同一簇,并将低密度区域的点标记为噪声点。通过两个参数:
eps
(邻域半径)和min_samples
(一个簇的最小样本数)。 -
优点:能够发现任意形状的簇,并且不需要预先指定簇的数量。
-
缺点:对于高密度区域和低密度区域的定义非常敏感,难以处理不同密度的数据。
from sklearn.cluster import DBSCAN # 假设 X 是数据集 dbscan = DBSCAN(eps=0.5, min_samples=5) labels = dbscan.fit_predict(X) # 获取每个样本的簇标签
-
-
Mean Shift
-
原理:Mean Shift 聚类算法通过计算数据点的均值,并将均值作为新的点的位置,逐步移动点到密度最大的区域。适用于任意形状的簇。
-
优点:不需要预先指定簇的数量,能够找到簇的中心。
-
缺点:计算复杂度较高,适合中小规模的数据集。
from sklearn.cluster import MeanShift # 假设 X 是数据集 mean_shift = MeanShift() labels = mean_shift.fit_predict(X) # 获取每个样本的簇标签
-
-
Gaussian Mixture Model (GMM)
-
原理:GMM 假设数据点是由多个高斯分布生成的,每个簇对应一个高斯分布。通过期望最大化(EM)算法来估计每个高斯分布的参数。
-
优点:能够处理不同形状的簇,并且可以提供簇的概率分布。
-
缺点:计算复杂度较高,需要预先指定簇的数量,可能会陷入局部最优解。
from sklearn.mixture import GaussianMixture # 假设 X 是数据集 gmm = GaussianMixture(n_components=3) labels = gmm.fit_predict(X) # 获取每个样本的簇标签
-
评估聚类结果
-
轮廓系数(Silhouette Score)
- 衡量样本与其簇内样本的相似度与其与最近簇的样本的相似度之比。
- 分数范围从 -1 到 1,值越高表示聚类效果越好。
from sklearn.metrics import silhouette_score score = silhouette_score(X, labels)
-
Calinski-Harabasz 指数(方差比)
- 衡量簇的紧密程度和簇间的分离程度。值越大,聚类效果越好。
from sklearn.metrics import calinski_harabasz_score score = calinski_harabasz_score(X, labels)
-
Davies-Bouldin 指数
- 衡量簇之间的相似度和簇的紧密度。值越小,聚类效果越好。
from sklearn.metrics import davies_bouldin_score score = davies_bouldin_score(X, labels)
总结
- 聚类是一种无监督学习方法,用于将数据集分成若干个簇,使得同一簇内的样本相似度高,而不同簇之间的样本相似度低。
- 常见的聚类算法包括 K-means、层次聚类、DBSCAN、Mean Shift 和 Gaussian Mixture Model (GMM)。
- 评估聚类结果的方法包括轮廓系数、Calinski-Harabasz 指数和 Davies-Bouldin 指数。
根据数据的特点和实际需求选择合适的聚类算法和评估方法,可以帮助更好地理解数据的内在结构。