在Python中集群~100,000个短字符串

时间:2010-11-22 02:27:55

标签: python numpy cluster-analysis levenshtein-distance

我希望通过像q-gram距离或简单的“包距离”或者Python中的Levenshtein距离来聚类~100,000个短字符串。我打算填写一个距离矩阵(100,000选择2个比较),然后用pyCluster进行分层聚类。但是我甚至在开始之前遇到了一些记忆问题。例如,距离矩阵对于numpy来说太大了。

aa = numpy.zeros((100000, 100000))
ValueError: array is too big.

这看起来像是一件合理的事吗?或者我注定要在这项任务中记忆问题?谢谢你的帮助。

4 个答案:

答案 0 :(得分:8)

100,000 * 100,000 * 32bits = 40 GBytes,这将是很多的RAM,所以是的,你需要找到另一种方式。 (即使你可以将这些数据放入内存中,计算也需要很长时间。)

一个常见而简单的捷径是聚类数据的一个小的随机子集,在找到该子集的聚类之后,只需将其余的点放入最适合的聚类中。

答案 1 :(得分:3)

100亿元素是非常多的。我不知道q-gram,但如果那个矩阵稀疏,你可以使用200,000-ish元素字典。

答案 2 :(得分:2)

你需要矩阵吗?我假设您想使用矩阵来提高速度?

我有一个k-means聚类算法(而不是分层聚类算法),这可以根据需要计算节点距离。但是,可能只适用于快速距离指标。你有比我更多的数据 - 但你受到内存限制的束缚。

答案 3 :(得分:2)

  1. 机器学习中有一种称为嵌入的方法,原则上可以使用 O (n + m)内存而不是 O <来搜索此问题的解决方案/ em>(n * m)(n = 10 ^ 5项,m = 10 ^ 5个特征)。不幸的是,我不知道在O(m + n)中实现的可用源代码。见:

      

    欧共体嵌入共生数据。   Amir Globerson,Gal Chechik,Fernando Pereira和Naftali Tishby。   机器学习研究期刊,JMLR,8(10月),2007。pdf /   Matlab code

  2. 可能还有其他解决方案。我认为您应该在机器学习人员论坛上提出这个问题,例如https://stats.stackexchange.com/,或者甚至更具体的语言处理:http://metaoptimize.com/qa/