我希望通过像q-gram距离或简单的“包距离”或者Python中的Levenshtein距离来聚类~100,000个短字符串。我打算填写一个距离矩阵(100,000选择2个比较),然后用pyCluster进行分层聚类。但是我甚至在开始之前遇到了一些记忆问题。例如,距离矩阵对于numpy来说太大了。
aa = numpy.zeros((100000, 100000))
ValueError: array is too big.
这看起来像是一件合理的事吗?或者我注定要在这项任务中记忆问题?谢谢你的帮助。
答案 0 :(得分:8)
100,000 * 100,000 * 32bits = 40 GBytes,这将是很多的RAM,所以是的,你需要找到另一种方式。 (即使你可以将这些数据放入内存中,计算也需要很长时间。)
一个常见而简单的捷径是聚类数据的一个小的随机子集,在找到该子集的聚类之后,只需将其余的点放入最适合的聚类中。
答案 1 :(得分:3)
100亿元素是非常多的。我不知道q-gram,但如果那个矩阵稀疏,你可以使用200,000-ish元素字典。
答案 2 :(得分:2)
你需要矩阵吗?我假设您想使用矩阵来提高速度?
我有一个k-means聚类算法(而不是分层聚类算法),这可以根据需要计算节点距离。但是,可能只适用于快速距离指标。你有比我更多的数据 - 但你受到内存限制的束缚。
答案 3 :(得分:2)
机器学习中有一种称为嵌入的方法,原则上可以使用 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
可能还有其他解决方案。我认为您应该在机器学习人员论坛上提出这个问题,例如https://stats.stackexchange.com/,或者甚至更具体的语言处理:http://metaoptimize.com/qa/。