文本文档聚类 - 非均匀聚类

Text Documents Clustering - Non Uniform Clusters

我一直在尝试对一组文本文档进行聚类。我有一个包含大约 10k 个文档(大型数据集的子集)的稀疏 TFIDF 矩阵,我尝试 运行 具有不同大小的簇 (10,50,100) 的 scikit-learn k-means 算法。其余参数均为默认值。

我得到一个非常奇怪的行为,无论我指定了多少个集群,或者即使我改变了迭代次数,批次中都会有 1 个集群,它本身包含大部分文档,并且会有许多集群中只有 1 个文档。这是高度不统一的行为

有谁知道我 运行遇到了什么样的问题?

以下是可能发生的事情 "wrong":

  1. 您的 k-means 聚类初始化点被选为每个 运行 中的同一组点。我建议使用 'random' 作为 k-means 的初始参数 http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html. If that doesn't work then supply to k-means your own set of random initial cluster centers. Remember to initialize your random generator using its seed() method as the current date and time. https://docs.python.org/2/library/random.html 使用当前日期时间作为默认值。

  2. 您的距离函数,即欧氏距离可能是罪魁祸首。这不太可能,但使用余弦相似度对 运行 k-means 总是好的,尤其是当您将它用于文档相似度时。 scikits 目前没有这个功能,但你应该看看这里:Is it possible to specify your own distance function using scikit-learn K-Means Clustering?

这两个组合应该会给你很好的集群。

我在上述答案和评论的帮助下注意到原始 space 中存在异常值和噪声问题。为此,我们应该使用降维方法来消除数据中不需要的噪声。我先尝试了随机投影,但它无法处理文本数据,仅仅是因为问题仍未解决。 然后使用截断奇异值分解,我能够得到完美的均匀簇。因此,在我看来,Truncated SVD 是处理文本数据的方式。