法→原理, 算法实现

K-Means改进算法X-Means/G-Means

钱魏Way · · 8 次浏览

X-Means 和 G-Means 都是基于 K-Means 的改进算法,主要目标是自动确定最优的聚类数量k,无需人工预先指定。

X-Means

X-Means 是一种能够自动确定最佳聚类数量的改进型K-Means算法,它通过统计指标来评估聚类质量,无需像传统K-Means那样预先指定K值。

下表清晰地展示了X-Means算法的核心步骤,你可以将其理解为一个循环迭代、不断自我评估和优化的过程。

步骤 关键操作 说明
1. 初始化 设定聚类数范围(如k_min=2, k_max)并运行K-Means。 从一个较小的、认为数据中至少存在的聚类数量开始。
2. 参数优化 在每个聚类内部分别运行K=2的K-Means算法。 尝试将每个现有的聚类一分为二,看看是否能形成更精细的结构。
3. 结构优化 使用BIC准则比较分裂前后的模型质量。 核心决策步骤。判断一分为二后,聚类效果的提升是否足以抵消模型复杂度的增加。
4. 迭代终止 重复步骤2和3,直到没有聚类可以通过分裂提升BIC分数,或达到预设的最大聚类数。 算法自动收敛,输出最终的聚类数量K和结果。

理解关键概念:BIC准则

BIC是X-Means算法的决策核心,其计算基于以下逻辑:

  • 数据似然度:模型对数据的拟合程度。拟合得越好,似然度越高。
  • 模型复杂度:由模型参数(如聚类中心、方差)的数量衡量。参数越多,模型越复杂,越容易“过拟合”。

BIC公式为:BIC = 对数似然值 – (参数数量 / 2) * log(样本数)。其核心思想是追求平衡:一个好的模型需要在拟合度和复杂度之间取得最佳平衡。X-Means会选择BIC值更高的模型。也就是说,分裂后只有当拟合度的提升显著大于复杂度带来的惩罚时,分裂才会被接受。

优势与局限

X-Means的优势主要体现在:

  • 自动化:无需人工反复尝试不同的K值,大大提升了分析效率。
  • 效率较高:相比手动运行多次K-Means,X-Means通过局部搜索和BIC准则,能以更少的计算量找到合适的K值。
  • 理论基础:BIC准则提供了一个统计上严谨的模型选择依据。

但也需要注意其局限性

  • 对初始值敏感:和K-Means一样,初始聚类中心的选择可能影响最终结果。
  • 高斯分布假设:其BIC计算通常假设聚类呈高斯分布,如果真实数据结构复杂(如非球形、流形),效果可能不理想。
  • 计算复杂度:虽然比手动尝试高效,但其内部需要多次运行K-Means,计算量仍大于标准K-Means。

G-Means

G-Means是一种基于统计假设检验的聚类算法,它能自动确定数据集中的最佳聚类数量K,其核心思想是通过检验每个聚类中的数据是否服从高斯分布,来决定是否需要将其进一步分裂。

核心思想:统计学驱动的聚类发现

G-Means从一个聚类(K=1)开始,像一个严谨的“高斯侦探”一样,逐一检查每个聚类:

“这个聚类里的数据真的来自一个高斯分布(即一个“纯粹的”簇)吗?如果不是,那它很可能隐藏着多个子簇。”

如果检验拒绝“数据来自高斯分布”的原假设,算法就会在该聚类内部中心点的方向上,生成两个新的子中心点,并将其分裂为两个聚类。这个过程不断重复,直到所有聚类都“纯正”(通过高斯检验)为止。

算法步骤详解

以下是G-Means算法的标准工作流程:

  • 初始化:设定k = 1,以整个数据集的均值作为初始聚类中心。
  • 运行K-Means:使用当前的k值运行标准K-Means算法,得到k个聚类及其中心。
  • 正态性检验(核心步骤):对每一个聚类i执行以下操作:
    • 降维:将该聚类中的所有点,减去其中心点c_i,得到中心化数据。然后计算其主成分方向v。
    • 投影:将所有中心化数据点投影到主成分方向v上,得到一组一维标量y。之后对y进行标准化(y = y / std(y)),使其具有单位方差。
    • 假设检验:对标准化后的y执行安德森-达林检验,这是一个对尾部分布异常非常敏感的正态性检验。
      • 原假设H0:y服从标准正态分布(即该聚类是单一高斯分布)。
      • 备择假设H1:y不服从标准正态分布。
    • 分裂决策:
      • 如果p值 < α(显著性水平,通常设为0001或0.05),则拒绝H0。这意味着有足够证据表明当前聚类不是单一高斯分布,需要分裂。
      • 分裂方法:沿主成分方向v,从原中心c_i向两侧偏移,生成两个新中心:c_i + λ * v和 c_i – λ * v(λ通常取一个与数据标准差相关的较小值,如5或1.0)。
    • 迭代:将分裂得到的新中心加入中心点列表,k值相应增加。然后回到步骤2,以更新后的中心点和k值重新运行K-Means。
    • 终止:当所有聚类都通过了正态性检验(即没有任何聚类需要分裂)时,算法终止,输出最终的聚类数量k和划分结果。

核心机制:安德森-达林检验

G-Means的强大之处在于其严谨的统计学基础。安德森-达林检验 比其他正态性检验(如K-S检验)对尾部分布的差异更为敏感,这使得它尤其擅长探测出那些“看起来像一个簇,但实际是多个高斯混合而成”的结构。

一个简单的理解:如果一个聚类真的是一个完美的球形高斯分布,那么它的数据投影到任何方向(特别是方差最大的主方向)上,都应该看起来像一个标准的钟形曲线。如果投影后的分布出现了双峰、过度尖锐或过度平坦的尾巴,A-D检验就会敏锐地捕捉到这种偏离,并给出一个极小的p值,从而触发分裂。

优势与特点

  • 理论坚实:基于严格的统计假设检验,结论的可解释性强。
  • 全自动:只需输入数据和显著性水平α,无需指定K值范围。
  • 适应性强:能从数据本身发现其内在的聚类层次结构。
  • 参数直观:主要参数α是统计学中的标准概念(显著性水平),易于理解和设置。

局限与挑战

  • 高斯假设:基本假设是真实聚类呈高斯分布。对于流形、环形等复杂结构,它会错误地不断分裂,导致K值过大。
  • 维度灾难:在高维空间中,所有数据都趋向于分布在球壳上,且投影检验的效力会下降,可能导致检验失败。
  • 计算成本:每次迭代都需要对每个聚类运行K-Means和多次A-D检验,当数据量大或迭代次数多时,计算开销可观。
  • 对初始中心敏感:继承了K-Means对初始值敏感的特性,可能导致局部最优。

X-Means 与 G-Means 的对比

X-Means 和 G-Means 都是 K-Means 的自动确定聚类数量K的扩展算法,但它们在核心思想、决策机制和适用场景上有显著差异。以下是两者的全方位对比:

核心对比表格

维度 X-Means G-Means
核心原理 基于信息准则的模型选择 基于统计假设检验的正态性验证
决策机制 全局评估:分裂后模型评分是否提高 局部评估:每个聚类是否服从高斯分布
评估准则 BIC(贝叶斯信息准则)或AIC Anderson-Darling正态性检验
起始策略 指定范围 [k_min, k_max],通常从k_min开始 从 k=1 开始,逐步分裂
分裂逻辑 如果分裂后BIC提高,则分裂 如果数据拒绝高斯假设,则分裂
计算复杂度 中等(需计算BIC) 较高(需多次统计检验)
理论基础 信息论/模型选择理论 统计推断/假设检验
核心问题 “分裂是否让整体模型更优?” “这个聚类是单一高斯分布吗?”

决策哲学的根本差异

X-Means采用功利主义思路:

“我们要找一个在拟合度与复杂度之间达到最佳平衡的模型。”

  • 通过BIC/AIC公式:BIC = 拟合度 – 复杂度惩罚
  • 决策标准:分裂后的BIC > 分裂前的BIC
  • 这是一种全局优化思路,考虑整个模型的质量

G-Means采用科学验证思路:

“我们假设每个聚类都是高斯分布,然后用统计方法检验这个假设。”

  • 原假设H₀:聚类数据来自高斯分布
  • 决策标准:p值 < α(拒绝原假设)
  • 这是一种局部检验思路,逐个检查每个聚类graph TD

实际表现差异

场景 X-Means表现 G-Means表现
清晰分离的高斯聚类 表现优秀,能准确找到K 表现优秀,能准确找到K
重叠的高斯混合 可能合并重叠聚类 可能过度分裂(尤其α较小时)
非球形聚类 表现差,会过度分裂 表现更差,会严重过度分裂
大样本量 计算效率较高 统计检验更可靠,但计算量更大
小样本量 BIC可能低估真实K 统计检验效力不足,可能无法检测到子结构
高维数据 需调整BIC计算 投影检验效力显著下降

参数调优对比

参数 X-Means G-Means 影响与建议
主要参数 k_min, k_max 显著性水平α α越小,G-Means越保守
典型设置 k_min=1, k_max=√N α=0.0001或0.05 α=0.0001更严格,避免过度分裂
初始中心 对结果有显著影响 对结果有显著影响 建议使用K-Means++初始化
停止条件 BIC不再提高或达到k_max 所有聚类通过正态性检验 G-Means可能迭代更多次

适用场景建议

推荐使用 X-Means 的场景:

  • 追求计算效率:数据集较大,需要快速得到结果
  • 已知K的大致范围:可以通过业务知识确定k_min和k_max
  • 需要平衡模型复杂度:明确希望在拟合度和模型简洁性之间平衡
  • 初步探索性分析:需要快速了解数据的大致聚类结构

推荐使用 G-Means 的场景:

  • 需要统计严谨性:研究或论文中需要可解释的统计依据
  • 无任何先验信息:完全不知道K值,甚至不知道范围
  • 数据呈高斯分布:有理由相信真实聚类近似高斯分布
  • 对过度分裂敏感:希望避免不必要的分裂,α=0.0001时很保守

实用选择指南

选择哪个算法?考虑以下问题:

  • 对统计严谨性的要求?
    • 高:选G-Means
    • 中低:选X-Means
  • 计算资源是否受限?
    • 是:选X-Means
    • 否:两者都可尝试
  • 数据是否近似高斯分布?
    • 明显是:G-Means可能更准确
    • 不确定:X-Means更稳健
    • 明显不是:两个都不适合,考虑DBSCAN、谱聚类
  • 是否需要控制K的范围?
    • 是:X-Means(可设置k_max)
    • 否:两者都可
  • 数据维度?
    • 高维(>50):都需要结合降维
    • 中低维:都可以直接尝试

性能表现总结

指标 X-Means G-Means 胜出方
计算速度 ⚡⚡⚡⚡ (快) ⚡⚡⚡ (中等) X-Means
理论严谨性 ⚡⚡⚡ (良好) ⚡⚡⚡⚡⚡ (优秀) G-Means
参数敏感性 中等(对k_range敏感) 高(对α敏感) X-Means
易用性 简单(只需范围) 中等(需理解α) X-Means
可解释性 中等(BIC分数) 优秀(p值、假设检验) G-Means
鲁棒性 中等 对高斯数据高,对非高斯数据低 取决于数据

实际使用建议

综合策略:

  • 先尝试X-Means,因其更简单、更快,可作为基线
  • 如果结果不合理或需要统计验证,再用G-Means验证
  • 使用轮廓系数、Davies-Bouldin指数等外部指标评估两种方法的结果
  • 结合领域知识判断哪个K值更合理

代码实践建议:

# 实际工作中可以两者都尝试
def find_best_k(data, methods=['xmeans', 'gmeans']):
    results = {}
    
    if 'xmeans' in methods:
        # 尝试不同k_range
        xmeans_results = []
        for k_min, k_max in [(1, 20), (1, 30), (2, 15)]:
            k, labels = run_xmeans(data, k_min, k_max)
            score = silhouette_score(data, labels)
            xmeans_results.append((k, score, labels))
        results['xmeans'] = max(xmeans_results, key=lambda x: x[1])
    
    if 'gmeans' in methods:
        # 尝试不同显著性水平
        gmeans_results = []
        for alpha in [0.001, 0.0001, 0.05]:
            k, labels = run_gmeans(data, alpha=alpha)
            score = silhouette_score(data, labels)
            gmeans_results.append((k, score, labels))
        results['gmeans'] = max(gmeans_results, key=lambda x: x[1])
    
    return results

总结

  • X-Means 是工程师的选择:实用、高效、有不错的理论基础,适合大多数实际应用场景。
  • G-Means 是统计学家/研究者的选择:严谨、可解释、统计基础坚实,适合需要严格统计验证的场景。
  • 黄金法则:没有绝对最好的算法,只有最适合你数据和需求的算法。建议在具体问题中两种都尝试,用多种评估指标和领域知识综合判断。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注