【问题标题】:Optimizing K (ideal # of clusters) Using PyCluster使用 PyCluster 优化 K(理想的集群数)
【发布时间】:2013-05-10 08:25:30
【问题描述】:

我正在使用 PyCluster 的 kMeans 对一些数据进行聚类——主要是因为 SciPy 的 kMeans2() 产生了无法克服的错误。 Mentioned here。无论如何,PyCluster kMeans 运行良好,我现在正在尝试优化 kMeans 集群的数量。 PyCluster 随附的文献表明我可以通过实现 EM 算法来优化它的 kMeans -- bottom of page 13 here -- 但我找不到一个例子。

有人可以指出一个 PyCluster k-means 优化问题吗?提前感谢您的帮助。

【问题讨论】:

标签: python c machine-learning scipy k-means


【解决方案1】:

PyCluster 的手册指的是与您所询问的不同的优化问题。当您询问如何确定最佳聚类数时,该手册涉及如何在给定聚类总数的情况下找到最佳聚类。要理解的概念是,k-means 是一种 EM(期望最大化问题)算法,不能保证最优聚类解决方案(其中最优聚类解决方案可以定义为最小化总和的聚类分配每个数据点与其聚类的平均值之间的距离的平方)。 k-means 的工作方式是这样的:

set cluster means to equal k randomly generated points
while not converged:
     # expectation step:
     for each point:
          assign it to its expected cluster (cluster whose mean it is closest to)
     # maximization step:
     for each cluster:
          # maximizes likelihood for cluster mean
          set cluster mean to be the average of all points assigned to it

k-means 算法将在给定初始化的情况下输出最佳解决方案,但不一定会在全局范围内找到最佳聚类解决方案。这是手册在第 13 页底部所指的内容。手册说 kcluster 例程将多次执行 EM(这正是 k-means 算法)并选择最佳聚类。它从来没有提到寻找最优簇数的问题。

也就是说,您可以使用一些启发式方法来确定最佳集群数量(例如参见 Wikipedia):

  1. 也许最简单的方法就是设置 k=sqrt(n/2),这通常被认为是最优的。
  2. 另一种方法是将数据分成两部分,一个训练集(可能是前 90% 的数据)和一个测试集(可能是最后 10% 的数据)。两组都应该代表整个数据集,因此您可能需要事先使用 random.shuffle 或 random.sample。仅使用训练集,您可以应用 k-means 聚类来查找聚类分配,从中可以推断出每个聚类的平均值。然后,使用测试数据集,计算每个数据点之间距离的平方和与其分配的聚类的平均值。最后,如果您绘制集群数量与测试误差的关系图,您(可能)会发现在 k 达到某个值后,误差将开始增加,或者至少停止减少。然后,您可以选择发生这种情况的 k。测试数据集的使用将有助于确保训练产生的聚类代表实际数据集,而不是您碰巧采样的特定训练集。如果你有 n 个训练数据点和 n 个聚类,你当然可以在训练集上获得一个完美的聚类,但是对于测试集的误差可能仍然很大。
  3. 或者您可以尝试更一般的高斯混合模型。在混合高斯模型中,有k个高斯分布,N_1,...,N_k,出现权重为c_1,...,c_k,其中c_1+...+c_k=1。以概率 c_i 从高斯 N_i 中提取数据点。 k-means 是一种特殊类型的混合高斯模型,其中每个高斯被假定为具有相等协方差且所有权重相等的球面。这个模型的一个优点是,如果你看到一些 c_i 真的很小,那么高斯驼峰可能不是一个真正的集群。为了降低复杂性(以及过度拟合的风险),您可以将高斯分布约束为球形或具有相等的协方差,这为您提供了一种行为几乎类似于 k-means 的聚类机制,只是它显示了每个聚类的重要性。

【讨论】:

  • 好吧,你太棒了;谢谢。如果我赞成,我会给它。一个后续问题:这些启发式方法是否适用于您所理解的文本文档?
  • 或者换一种说法,聚类文档时有推荐的启发式方法吗?据我了解,在对文档进行聚类时,首先根据术语/术语频率“矢量化”每个文档(例如,使用 tf-idf 粗略估计文档的主题),但如果每个文档都相同(10,000 个重复,例如),我认为您只想要一个集群,但是像经验法则启发式这样的东西会推荐比一个更多的集群。因此,假设我的直觉是正确的,您是否知道或推荐用于文档聚类的特定启发式方法?再次感谢非常
  • ps:我们切换到 SciKit Learn 包 b/c,它似乎更适合我们正在尝试做的事情。不知道这是否会影响您的分析,但以防万一。再一次,我不能感谢你,丁先生。
  • 我对文本挖掘特别了解不多,但我的基本直觉是,由于文档是高维对象(不确定您为 tf-idf 考虑了多少字,但可能超过 10 个?),k-means 本身并不适合解决这个问题。一般来说,k-means 不适用于high dimensional data。您应该(如果您还没有)首先使用 PCA 或其他降维算法来处理您的数据。我还会考虑 Autoclass(基于朴素贝叶斯)、HAC 或潜在狄利克雷分配。
  • Latent Dirichlet Allocation 实际上是由文档分析驱动的,但它没有在 sci-kit 中实现。论文中提到的潜在语义索引似乎也是一个减少维度的好主意(并且 numpy 具有所需的奇异值分解功能);应用 LSI 后,可以应用 k-means。 HAC 是一种简单的算法,不受维数诅咒,在 sci-kit 中实现,但运行时间要长得多。
猜你喜欢
  • 2020-10-24
  • 2018-10-10
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2015-12-31
  • 2014-02-08
  • 2015-07-20
相关资源
最近更新 更多