集群的计算

时间:2016-04-28 14:50:09

标签: python numpy nlp cluster-analysis k-means

我正在测试文本文档数据集上的一些聚类算法(以词频为特征)。一个接一个地运行Scikit Learn Clustering的一些方法,下面是他们花费多长时间~~ 50,000个文件,每个文件有26个特征。每次采集收敛的时间差异很大,我投入的数据越多越极端;其中一些(例如MeanShift)在数据集增长到一定大小后才停止工作。

(下面给出的时间是脚本开头的总数,即KMeans花了0.004分钟,Meanshift(2.56 - 0.004)分钟等)。

shape of input: (4957, 26)

KMeans:    0.00491824944814
MeanShift:     2.56759268443
AffinityPropagation:     4.04678163528
SpectralClustering:     4.1573699673
DBSCAN:     4.16347868443
Gaussian:     4.16394021908
AgglomerativeClustering:     5.52318491936
Birch:     5.52657626867

我知道某些聚类算法本质上更具计算密集性(例如,章节here概述了Kmeans的需求与数据点的数量成线性关系,而层次模型 O(m 2 < / SUP> 10gm的))。 所以我想知道

  • 如何确定每种算法可以有多少数据点 处理;并且是输入文件/输入功能的数量相等 相关的这个等式?
  • 计算强度取决于聚类多少 设置 - 例如Kmeans中的距离度量或DBSCAN中的 e
  • 聚类成功是否会影响计算时间?一些算法 比如DBSCAN很快就完成了 - 因为他们找不到 数据中的任何聚类; Meanshift也找不到集群 并且仍然需要永远。 (我在这里使用默认设置)。威力 一旦发现数据中的结构,它会发生巨大变化吗?
  • 原始计算能力对这些产品的限制因素是多少 算法?我能用~30集群〜300,000个文件吗? 常规台式计算机上的每个功能?或者它是否有意义 使用计算机集群来做这些事情?

非常感谢任何帮助!测试在Mac mini,2.6 Ghz,8 GB上运行。数据输入为numpy array

1 个答案:

答案 0 :(得分:1)

这是一个过于宽泛的问题。

事实上,大部分问题都没有答案。

例如k-means 只是线性O(n),但因为收敛所需的迭代次数往往会随着数据集大小而增加,所以它比这更加昂贵(如果运行到收敛)。

分层聚类可以是从O(n log n)到O(n ^ 3)的任何地方,主要取决于它的实现方式和链接。如果我没记错的话,sklearn实现就是O(n ^ 3)算法。

某些算法具有提前停止的参数。在他们真正完成之前!对于k-means,如果要真正完成算法,则应使用tol=0。否则,如果相对改善小于这个因素,它会提前停止 - 这可能太早了。 MiniBatchKMeans永远不会收敛。因为它每次只查看数据的随机部分,所以除非你选择固定数量的迭代,否则它将永远存在。

永远不要试图从小数据集中得出结论。您需要转到限制。即对于每种算法,您仍然可以在1小时,2小时,4小时和12小时内处理的最大数据集是多少? 要获得有意义的结果,您的运行时应该小时,除非算法之前的内存耗尽 - 然后您可能有兴趣预测在内存耗尽之前可以扩展多远 - 假设你有1 TB的RAM,你还能处理的数据有多大?

问题是,您不能简单地为不同大小的数据集使用相同的参数。如果你没有很好地选择参数(例如DBSCAN将所有内容都放入噪声中,或者将所有内容都放入一个簇中),那么你也无法从中得出结论。

然后,可能只会出现实施错误。最近,sklearn的DBSCAN变得更快了很多。它仍然是相同的算法。因此,2年前完成的大多数结果都是错误的,因为在sklearn中实施DBSCAN很糟糕......现在它好多了,但它是最优的吗?可能不是。任何这些算法都可能存在类似的问题!

因此,做好群集的基准是真的很难。事实上,我没有在漫长的时间里看到一个好的基准。