文本文档聚类 - 非均匀聚类
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 是处理文本数据的方式。
【讨论】:
以上是关于文本文档聚类 - 非均匀聚类的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用 h2o4gpu K-Means 对文本文档进行聚类