高斯混合模型与K均值聚类算法对比分析——基于MLAlgorithms项目
2025-07-06 05:26:49作者:胡易黎Nicole
概述
本文将通过MLAlgorithms项目中的高斯混合模型(Gaussian Mixture Model, GMM)和K均值(K-Means)聚类算法的实现,对比分析这两种经典聚类方法的原理、实现及应用效果。我们将重点解析项目中的示例代码,并通过可视化结果直观展示两种算法的差异。
算法原理简介
K均值聚类
K均值是一种基于距离的硬聚类算法,其主要思想是:
- 随机选择K个中心点
- 将每个数据点分配到最近的中心点
- 重新计算中心点位置
- 重复步骤2-3直到收敛
高斯混合模型
GMM是一种基于概率的软聚类算法,其特点包括:
- 假设数据由多个高斯分布混合生成
- 使用EM算法进行参数估计
- 提供每个数据点属于各簇的概率
- 能处理非球形簇
代码解析
数据生成
示例中使用make_clusters
函数生成测试数据:
def make_clusters(skew=True, *arg, **kwargs):
X, y = datasets.make_blobs(*arg, **kwargs)
if skew:
nrow = X.shape[1]
for i in np.unique(y):
X[y == i] = X[y == i].dot(np.random.random((nrow, nrow)) - 0.5)
return X, y
关键点:
- 基于sklearn的
make_blobs
生成初始数据 skew
参数控制是否对数据进行线性变换,使簇形状更复杂- 线性变换矩阵随机生成,增加数据分布的多样性
算法比较函数
def KMeans_and_GMM(K):
COLOR = "bgrcmyk"
X, y = make_clusters(skew=True, n_samples=1500, centers=K)
_, axes = plt.subplots(1, 3)
# 真实分布可视化
axes[0].scatter(X[:, 0], X[:, 1], c=[COLOR[int(assignment)] for assignment in y])
axes[0].set_title("Ground Truth")
# K均值聚类
kmeans = KMeans(K=K, init="++")
kmeans.fit(X)
kmeans.predict()
axes[1].set_title("KMeans")
kmeans.plot(ax=axes[1], holdon=True)
# 高斯混合模型
gmm = GaussianMixture(K=K, init="kmeans")
gmm.fit(X)
axes[2].set_title("Gaussian Mixture")
gmm.plot(ax=axes[2])
关键点:
- 生成1500个样本点,分为K个簇
- 使用三幅子图分别展示真实分布、K均值结果和GMM结果
- K均值使用k-means++初始化
- GMM使用K均值结果进行初始化
结果分析
运行代码后,我们可以观察到:
-
真实分布:展示数据原始分布情况,簇的形状可能因线性变换而变得不规则
-
K均值结果:
- 簇边界为直线
- 对非球形簇效果较差
- 每个点明确属于一个簇
-
GMM结果:
- 能更好适应不规则形状的簇
- 边界更平滑
- 考虑数据分布的概率特性
实际应用建议
-
选择K均值当:
- 数据量较大,需要快速聚类
- 簇形状接近球形
- 需要硬聚类结果
-
选择GMM当:
- 簇形状复杂或不规则
- 需要概率形式的聚类结果
- 对计算资源要求不高
-
调参技巧:
- 两种算法都对初始化敏感,可尝试多次运行取最佳结果
- GMM可尝试不同协方差矩阵类型(全协方差、对角协方差等)
- 可通过BIC/AIC准则选择最佳簇数K
总结
MLAlgorithms项目提供了清晰的高斯混合模型和K均值聚类的实现,通过对比实验我们可以直观理解两种算法的差异。在实际应用中,应根据数据特点和需求选择合适的聚类方法,必要时可以结合使用,如用K均值结果为GMM提供初始化。