本文的主要目的是总结记录日常学习工作中常用到的一些数据聚类算法,对其原理简单总结记录,同时分析对应的优缺点,以后需要的时候可以直接翻看,避免每次都要查询浪费时间,欢迎补充。
聚类算法是一种无监督学习的方法,用于将数据集中的样本按照某种相似度或距离度量进行分组。以下是一些常见的聚类算法:
-
K-means聚类算法:将数据集划分为K个聚类,每个聚类以其质心(centroid)为代表。通过迭代优化,将样本点分配给与其最近的质心,然后更新质心位置,直到达到收敛条件。
-
层次聚类算法(Hierarchical Clustering):基于样本间的相似性或距离,逐渐构建出一个层次结构的聚类结果。分为凝聚聚类(Agglomerative Clustering)和分裂聚类(Divisive Clustering)两种方法。
-
DBSCAN聚类算法:基于密度的聚类算法,可以识别出具有足够样本密度的区域,并将其作为一个簇。可以自动发现任意形状的聚类。
-
高斯混合模型(GMM)聚类算法:假设数据由多个高斯分布组成,通过估计每个分布的参数,将样本分配给对应的分布,从而实现聚类。
-
密度峰值聚类(Density Peak Clustering):通过寻找样本点的局部密度和相对于其他样本点的距离,找出具有较高密度的样本点作为聚类中心。
-
均值漂移(Mean Shift)聚类算法:通过不断迭代,将样本点向密度最大的方向移动,从而找到聚类中心。
-
谱聚类(Spectral Clustering)算法:根据数据的相似性构建相似度矩阵,并将其转换为拉普拉斯矩阵,最后通过对拉普拉斯矩阵进行特征分解来实现聚类。
这些聚类算法在不同的场景和数据集上有各自的优势和适用性。选择合适的聚类算法需要考虑数据特点、聚类目标以及算法的复杂度和可扩展性。
当数据没有明确的标签信息时,聚类算法可以帮助我们发现数据中的潜在结构和模式。以下是对每种聚类算法的详细介绍,包括算法原理、优点和缺点:
(1)K-means聚类算法:
算法原理:
K-means聚类将数据集划分为K个聚类,并通过迭代优化来不断更新聚类中心。算法的步骤包括初始化K个聚类中心、计算样本与聚类中心的距离、将样本分配给最近的聚类中心、更新聚类中心位置并重复以上步骤直到收敛。
优点:
简单且易于实现,计算效率高;对于大型数据集具有较好的可扩展性;适用于凸型或球状聚类结构的数据。
缺点:
需要事先指定聚类数目K;对于不同形状、密度不均匀的聚类结构效果可能较差。
代码实现如下:
# Load the iris dataset
iris = load_iris()
X = iris.data
# K-means clustering
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
kmeans_labels = kmeans.labels_
(2)层次聚类算法(Hierarchical Clustering):
算法原理:
层次聚类根据样本间的相似度或距离逐渐构建出一个层次结构的聚类结果。凝聚聚类从每个样本开始,逐步合并最相似的样本,直到形成一个大聚类;分裂聚类从包含所有样本的大聚类开始,逐步将其分解为更小的子聚类。
优点:
无需指定聚类数目;结果呈现层次结构,可以通过截取树状图来获得不同聚类数目的结果;适用于多种聚类结构。
缺点:
计算复杂度较高,特别是对于大规模数据集;对于噪声和孤立点敏感。
代码实现如下:
# Load the iris dataset
iris = load_iris()
X = iris.data
# Hierarchical clustering
hierarchical = AgglomerativeClustering(n_clusters=3)
hierarchical_labels = hierarchical.fit_predict(X)
(3)DBSCAN聚类算法:
算法原理:
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于密度的聚类算法,通过确定样本周围的邻近样本密度来划分聚类。核心样本是周围距离内至少包含MinPts个样本的样本,密度可达样本是通过核心样本密度凸包连通得到的样本。
优点:
能够自动发现任意形状的聚类,对于密度不均匀的聚类结构效果好;对噪声和孤立点具有鲁棒性。
缺点:
对于样本密度差异较大的数据集,需要事先调节参数;不适用于高维数据,容易受到维度灾难的影响。
代码实现如下:
# Load the iris dataset
iris = load_iris()
X = iris.data
# DBSCAN clustering
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)
(4)高斯混合模型(GMM)聚类算法:
算法原理:
高斯混合模型假设数据由多个高斯分布组成,通过估计每个分布的参数,将样本分配给对应的分布。可以使用EM算法进行参数估计。
优点:
能够模拟复杂的数据分布,适用于非凸型、椭圆形状的聚类;对于数据集中存在的噪声和异常值具有较好的鲁棒性。
缺点:
对于大规模数据集计算复杂度较高;需要事先指定高斯分布数目。
代码实现如下:
# Load the iris dataset
iris = load_iris()
X = iris.data
# Gaussian Mixture Model (GMM) clustering
gmm = GaussianMixture(n_components=3)
gmm.fit(X)
gmm_labels = gmm.predict(X)
(5)密度峰值聚类(Density Peak Clustering):
算法原理:
密度峰值聚类是一种基于样本点的密度和相对距离的聚类方法。其原理如下:
首先,计算每个样本点的局部密度,表示该样本周围的样本数量或密度。
然后,计算每个样本点与其他样本点的最小距离(距离可以使用欧氏距离等度量)。
根据局部密度和最小距离确定每个样本点的密度峰值,并将具有较高局部密度和较远最小距离的样本点作为聚类中心。
最后,将其他样本分配给距离最近的密度峰值所在的簇。
密度峰值聚类的优点和缺点如下:
优点:
能够发现任意形状和大小的聚类,不受密度均匀性的限制。
对噪声和离群点具有较好的鲁棒性,能够识别出没有明显密度峰值的数据。
不需要预先指定聚类数目,自动确定聚类中心。
缺点:
当数据集存在多个密度峰值且密度相似时,聚类结果可能不稳定。
对参数的选择比较敏感,如设置最小距离阈值等。
在处理大规模数据集时,计算样本点之间的距离和局部密度较为耗时。
代码实现如下:
# Load the iris dataset
iris = load_iris()
X = iris.data
# Density Peak Clustering
# You may need to install the density_peaks package first:
# pip install density-peaks-clustering
from density_peaks import density_peaks
dp = density_peaks.DensityPeaks(n_clusters=3)
dp.fit(X)
dp_labels = dp.labels_
(6)均值漂移(Mean Shift)聚类算法:
算法原理:
均值漂移聚类算法通过不断迭代,将样本点向密度最大的方向移动,从而找到聚类中心。具体步骤如下:
初始化每个样本点的位置作为当前估计的聚类中心。
对于每个样本点,计算其周围样本的平均位置(均值漂移向量),并将样本点向该位置移动。
重复步骤2,直到达到收敛条件或迭代次数限制。
优点:
不需要事先指定聚类数目,能够自适应地确定聚类中心的数量。
能够处理任意形状和大小的聚类,对噪声和离群点具有较好的鲁棒性。
相比于K-means等方法,对于非球状的聚类结构效果更好。
缺点:
运行时间较长,特别是在处理大规模数据集时,由于每个样本都需要计算均值漂移向量。
对于高维数据,由于维数灾难的影响,可能出现聚类效果不佳。
对于具有多个密度峰值且密度相似的数据集,聚类结果可能不稳定。
代码实现如下:
# Load the iris dataset
iris = load_iris()
X = iris.data
# Mean Shift clustering
mean_shift = MeanShift()
mean_shift_labels = mean_shift.fit_predict(X)
(7)谱聚类(Spectral Clustering)算法:
算法原理:
谱聚类算法根据数据的相似性构建相似度矩阵,并将其转换为拉普拉斯矩阵。然后,通过对拉普拉斯矩阵进行特征分解来实现聚类。
构建相似度矩阵:通常使用高斯核函数计算样本之间的相似度,或者使用K近邻方法选择最近的样本作为相似样本。
转换为拉普拉斯矩阵:根据相似矩阵构建拉普拉斯矩阵,可以使用标准化的拉普拉斯矩阵或对称标准化的拉普拉斯矩阵。
特征分解:对拉普拉斯矩阵进行特征分解,得到特征向量,并使用K-means等聚类方法对特征向量进行聚类。
优点:
可以处理非凸形状和大小不同的聚类,适用于任意形状的数据分布。
相比于K-means等传统方法,对于图像分割、社交网络等具有复杂关系的数据集效果更好。
不需要预先指定聚类数目,能够自适应地确定聚类数量。
缺点:
对于大规模数据集,计算相似度矩阵和特征分解的计算复杂度较高。
需要事先调节参数,如相似度阈值、K近邻数目等。
对于高维数据,可能出现"维度灾难"问题,聚类效果不佳。
代码实现如下所示:
# Load the iris dataset
iris = load_iris()
X = iris.data
# Spectral clustering
spectral = SpectralClustering(n_clusters=3)
spectral_labels = spectral.fit_predict(X)