在 Python 中聚类约 100,000 个短字符串

Posted

技术标签:

【中文标题】在 Python 中聚类约 100,000 个短字符串【英文标题】:Clustering ~100,000 Short Strings in Python 【发布时间】:2011-05-13 14:34:47 【问题描述】:

我想通过诸如 q-gram 距离或简单的“袋子距离”或 Python 中的 Levenshtein 距离之类的东西对约 100,000 个短字符串进行聚类。我打算填写一个距离矩阵(100,000 选择 2 个比较),然后使用pyCluster 进行层次聚类。但我什至在起步之前就遇到了一些记忆问题。例如,距离矩阵对于 numpy 来说太大了。

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

这看起来是否合理?还是我注定要在这项任务中出现记忆问题?感谢您的帮助。

【问题讨论】:

100亿是一个很大的数字。 我正在考虑解决这个有趣问题的方法,但我错过了一些信息。请详细说明您到底要完成什么,以及原因和可能的假设/限制。这里有 2 个特别的问题。 1) 你可以在你的分析中复制字符串吗? 2)你真的需要所有 2×2 的距离,还是说对于给定的字符串,只有一小部分距离就足够了?干杯。 【参考方案1】:

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

一种常见且简单的捷径是对数据的一个小的随机子集进行聚类,找到该子集的聚类后,只需将其余点放入最适合的聚类中即可。

【讨论】:

你的机器不是有4096GB内存吗? 感谢您的计算。是的,目前的方法似乎是不可能的。 抱歉,两年后在这里吹毛求疵:由于距离矩阵是对称的,所以应该是 20 GB。【参考方案2】:

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

【讨论】:

我读过关于稀疏矩阵的文章。正如你所说,不清楚数据是否稀疏......我将不得不做更多的测试。 pyCluster 是否可以处理稀疏矩阵也不清楚(对我来说)。感谢您的建议。 你想对数据做什么?我认为这是一个非常重要的问题。 原则上,这样的矩阵不会是稀疏的。创建这样一个稀疏矩阵的一个问题是如何确定是否要评估某个矩阵元素。【参考方案3】:

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

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

【讨论】:

是的,这样的事情似乎是解决方案。谢谢。【参考方案4】:

    机器学习中有一种方法叫做 Embedding,原则上,它可以使用 O(n+m) 内存而不是 O 来搜索这个问题的解决方案(n*m)(n=10^5 个项目,m=10^5 个特征)。不幸的是,我不知道在 O(m+n) 中实现的可用源代码。见:

    共现数据的欧几里得嵌入。 Amir Globerson、Gal Chechik、Fernando Pereira 和 Naftali Tishby。 机器学习研究杂志, JMLR, 8 (Oct), 2007.pdf/ Matlab code

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

【讨论】:

以上是关于在 Python 中聚类约 100,000 个短字符串的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中聚类方法的并行化

在python中聚类巨大的数据矩阵?

100万个对象的层次聚类

5中聚类方法介绍

R 中聚类的训练和测试评估

常见的5中聚类算法