聚类算法是无监督学习的一种,主要用于将数据集中的样本划分为若干个簇,使得同一簇内的样本具有较高的相似度,而不同簇之间的样本差异较大。以下是几种常见的聚类算法及其详细讲解:
1. K-means 聚类
原理
K-means 是一种迭代优化算法,目标是将数据集分成 K 个簇,每个簇由一个中心点(质心)表示。算法通过最小化样本到质心的距离平方和(即簇内平方误差)来确定最佳簇划分。
步骤:
- 随机选择 K 个初始质心。
- 分配每个样本到最近的质心,形成 K 个簇。
- 计算每个簇的质心(均值)。
- 重复步骤 2 和 3,直到质心不再变化或达到最大迭代次数。
损失函数
J
=
∑
i
=
1
K
∑
x
∈
C
i
∥
x
−
μ
i
∥
2
J = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2
J=i=1∑Kx∈Ci∑∥x−μi∥2
其中,( C_i ) 是第 i 个簇,( mu_i ) 是第 i 个簇的质心。
使用场景
适用于样本数量大、簇数已知的数据集,如图像压缩、市场细分。
优缺点
优点:
- 简单易实现
- 计算速度快
缺点:
- 对初始质心敏感
- 需要预定义簇数 K
- 不适合非凸形状的簇
代码实例
from sklearn.cluster import KMeans
import numpy as np
# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])
# 模型训练
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
# 预测簇标签
labels = kmeans.predict(X)
print(labels)
# 输出簇中心
centers = kmeans.cluster_centers_
print(centers)
2. 层次聚类(Hierarchical Clustering)
原理
层次聚类通过构建层次树(dendrogram)来实现对数据的逐层聚类。主要有两种方法:
- 自底向上(凝聚法,agglomerative):每个样本开始作为一个簇,逐渐合并最近的簇,直到所有样本合并成一个簇。
- 自顶向下(分裂法,divisive):从一个整体簇开始,逐步分裂成更小的簇,直到每个样本单独成为一个簇。
合并准则(凝聚法常用的距离度量):
- 最短距离(单链接)
- 最长距离(完全链接)
- 平均距离
使用场景
适用于层次结构明显的数据,如基因表达数据、社会网络分析。
优缺点
优点:
- 不需要预定义簇数
- 能够发现层次关系
缺点:
- 计算复杂度高
- 对噪声和异常值敏感
代码实例
from sklearn.cluster import AgglomerativeClustering
import numpy as np
# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])
# 模型训练
agg_clustering = AgglomerativeClustering(n_clusters=2).fit(X)
# 预测簇标签
labels = agg_clustering.labels_
print(labels)
3. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
原理
DBSCAN 是一种基于密度的聚类算法,通过高密度区域形成簇。它能够发现任意形状的簇,并自动识别噪声点。
步骤:
- 对于数据集中的每个点,计算其ε-邻域内的点数。
- 如果某点的ε-邻域内的点数大于等于最小样本数(minPts),则认为该点是核心点,形成一个簇。
- 扩展簇:对每个核心点的ε-邻域内的点重复上述步骤,直到簇不再增长。
- 标记所有未分配到任何簇的点为噪声点。
使用场景
适用于噪声较多、簇形状复杂的数据,如地理空间数据、市场分析。
优缺点
优点:
- 能发现任意形状的簇
- 自动识别噪声
缺点:
- 需要预定义参数 ε 和 minPts
- 对参数敏感
代码实例
from sklearn.cluster import DBSCAN
import numpy as np
# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])
# 模型训练
dbscan = DBSCAN(eps=1.5, min_samples=2).fit(X)
# 预测簇标签
labels = dbscan.labels_
print(labels)
4. 高斯混合模型(Gaussian Mixture Model, GMM)
原理
GMM 假设数据是由多个高斯分布组成的混合模型,通过期望最大化(EM)算法估计每个高斯分布的参数,并计算每个样本属于各个高斯分布的概率。
步骤:
- 初始化高斯分布的参数(均值、方差、混合系数)。
- E步:计算每个样本属于各个高斯分布的后验概率。
- M步:根据后验概率更新高斯分布的参数。
- 重复 E 步和 M 步,直到参数收敛。
使用场景
适用于数据分布接近高斯分布的情况,如金融数据分析、图像处理。
优缺点
优点:
- 能处理不同形状和大小的簇
- 提供概率输出
缺点:
- 需要预定义簇数
- 对初始参数敏感
代码实例
from sklearn.mixture import GaussianMixture
import numpy as np
# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])
# 模型训练
gmm = GaussianMixture(n_components=2, random_state=0).fit(X)
# 预测簇标签
labels = gmm.predict(X)
print(labels)
# 输出高斯分布的参数
print(gmm.means_)
print(gmm.covariances_)
5. Mean Shift 聚类
原理
Mean Shift 是一种基于密度的聚类算法,通过不断移动每个点到其局部密度最大的位置来找到簇的中心。算法通过密度梯度上升(Mean Shift)迭代移动质心,直到收敛。
步骤:
- 初始化每个点为质心。
- 对每个质心,计算其窗口内的密度中心,并将质心移动到该位置。
- 重复步骤 2,直到质心收敛。
使用场景
适用于簇数量未知、密度分布明显的数据,如图像分割、模式识别。
优缺点
优点:
- 不需要预定义簇数
- 能发现任意形状的簇
缺点:
- 计算复杂度高
- 对带宽参数敏感
代码实例
from sklearn.cluster import MeanShift
import numpy as np
# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])
# 模型训练
mean_shift = MeanShift().fit(X)
# 预测簇标签
labels = mean_shift.labels_
print(labels)
# 输出簇中心
centers = mean_shift.cluster_centers_
print(centers)
总结
不同的聚类算法有各自的特点和适用场景。在实际应用中,选择适合的聚类算法需要根据数据的特点和具体需求进行权衡,并且可以通过实验和调参来优化聚类效果。