首页
/ 高斯混合模型与K均值聚类算法对比分析——基于MLAlgorithms项目

高斯混合模型与K均值聚类算法对比分析——基于MLAlgorithms项目

2025-07-06 05:26:49作者:胡易黎Nicole

概述

本文将通过MLAlgorithms项目中的高斯混合模型(Gaussian Mixture Model, GMM)和K均值(K-Means)聚类算法的实现,对比分析这两种经典聚类方法的原理、实现及应用效果。我们将重点解析项目中的示例代码,并通过可视化结果直观展示两种算法的差异。

算法原理简介

K均值聚类

K均值是一种基于距离的硬聚类算法,其主要思想是:

  1. 随机选择K个中心点
  2. 将每个数据点分配到最近的中心点
  3. 重新计算中心点位置
  4. 重复步骤2-3直到收敛

高斯混合模型

GMM是一种基于概率的软聚类算法,其特点包括:

  1. 假设数据由多个高斯分布混合生成
  2. 使用EM算法进行参数估计
  3. 提供每个数据点属于各簇的概率
  4. 能处理非球形簇

代码解析

数据生成

示例中使用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均值结果进行初始化

结果分析

运行代码后,我们可以观察到:

  1. 真实分布:展示数据原始分布情况,簇的形状可能因线性变换而变得不规则

  2. K均值结果

    • 簇边界为直线
    • 对非球形簇效果较差
    • 每个点明确属于一个簇
  3. GMM结果

    • 能更好适应不规则形状的簇
    • 边界更平滑
    • 考虑数据分布的概率特性

实际应用建议

  1. 选择K均值当

    • 数据量较大,需要快速聚类
    • 簇形状接近球形
    • 需要硬聚类结果
  2. 选择GMM当

    • 簇形状复杂或不规则
    • 需要概率形式的聚类结果
    • 对计算资源要求不高
  3. 调参技巧

    • 两种算法都对初始化敏感,可尝试多次运行取最佳结果
    • GMM可尝试不同协方差矩阵类型(全协方差、对角协方差等)
    • 可通过BIC/AIC准则选择最佳簇数K

总结

MLAlgorithms项目提供了清晰的高斯混合模型和K均值聚类的实现,通过对比实验我们可以直观理解两种算法的差异。在实际应用中,应根据数据特点和需求选择合适的聚类方法,必要时可以结合使用,如用K均值结果为GMM提供初始化。