python - 集群的计算

标签 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(m2logm))。 所以我想知道

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

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

最佳答案

这个问题太笼统了。

事实上,大多数这些问题都没有答案。

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

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

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

永远不要试图从小数据集中得出结论。您需要达到您的极限。 IE。每种算法在 1、2、4 和 12 小时内仍然可以处理的最大数据集是多少? 要获得有意义的结果,您的运行时间应该是小时,除非算法在此之前只是用完内存 - 那么您可能有兴趣预测在内存用完之前可以扩展多远 - 假设您有 1 TB 的 RAM,您仍然可以处理的数据有多大?

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

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

因此,做一个好的聚类基准测试真的很困难。事实上,我已经很久没有看到好的基准了。

关于python - 集群的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36918199/

相关文章:

python - Numpy 通过分组数组拆分数组

python - 提高 Python + numpy 数组分配/初始化性能

python - numpy 数组用掩码求平均值

python - Tensorflow 阅读 CSV - 什么是最好的方法

python - 网页字数统计

machine-learning - 优化 word2vec 模型比较

elasticsearch - Elasticsearch 中基于人类语言的搜索

python - 有没有一种简单的方法可以使列表表现为文件(使用 ftplib)

Python 在没有第三方库的情况下操作和保存 XML

python - 如何在numpy矩阵下将特定列中的值转换为整数类型