2

我正在使用 PyCluster 的 kMeans 对一些数据进行聚类——主要是因为 SciPy 的 kMeans2() 产生了无法克服的错误。 这里提到了。无论如何,PyCluster kMeans 运行良好,我现在正在尝试优化 kMeans 集群的数量。PyCluster 的随附文献表明,我可以通过实现 EM 算法来优化其 kMeans——此处为第 13 页的底部——但我找不到一个示例。

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

4

1 回答 1

7

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 的聚类机制,只是它显示了每个聚类的重要性。
于 2013-05-15T20:21:07.310 回答