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

Posted

技术标签:

【中文标题】文本文档聚类 - 非均匀聚类【英文标题】:Text Documents Clustering - Non Uniform Clusters 【发布时间】:2015-04-27 21:23:23 【问题描述】:

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

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

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

【问题讨论】:

k-means 对异常值不是很健壮。 1 元素簇通常是异常值。 是的,这正是我一直在想的,因为我怀疑有很多异常值。我想知道哪种算法可能更适合这种情况。 【参考方案1】:

以下是可能出现“错误”的情况:

    您的 k-means 集群初始化点在每次运行中被选为相同的点集。我建议对 k-means http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html 的 init 参数使用“随机”。如果这不起作用,则向 k-means 提供您自己的一组随机初始聚类中心。请记住使用其 seed() 方法作为当前日期和时间来初始化您的随机生成器。 https://docs.python.org/2/library/random.html 使用当前日期时间作为默认值。

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

这两者结合起来应该会给你很好的集群。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于文本文档聚类 - 非均匀聚类的主要内容,如果未能解决你的问题,请参考以下文章

聚类文本文档并获取重复的***术语

使用 SciKit 在 python 中进行文档聚类

使用 Weka 在 Java 中进行文档聚类

在 Python 中使用 h2o4gpu K-Means 对文本文档进行聚类

使用 sklearn tf-idf 查找矢量化文本文档中的簇数

使用学习对文本文档进行排名?