我一直在尝试对一组文本文档进行集群。我有一个稀疏的TFIDF矩阵,其中包含大约10k个文档(大型数据集的子集),我尝试用不同大小的聚类(10,50100)运行scikit学习k-means算法。其余所有参数均为默认值。
我得到了一个非常奇怪的行为,无论我指定了多少个集群,或者即使我改变了迭代次数,这个集群中都会有一个集群,其中包含大部分文档,而且会有很多集群中只有一个文档。这是高度不均匀的行为
有人知道我遇到了什么样的问题吗?
以下是可能出现"错误"的情况:
-
您的k-means集群初始化点被选择为每次运行中的同一组点。我建议对k-means的init参数使用"random"http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html.如果这不起作用,那么提供给k-意味着你自己的一组随机初始聚类中心。请记住将随机生成器的seed()方法初始化为当前日期和时间。https://docs.python.org/2/library/random.html使用当前日期时间作为默认值。
-
你的距离函数,即欧氏距离可能是罪魁祸首。这种可能性较小,但使用余弦相似度运行k-means总是很好的,尤其是当您使用它来计算文档相似度时。scikit目前没有这个功能,但你应该看看这里:是否可以使用scikit学习K-Means聚类来指定你自己的距离函数?
这两个结合起来应该会给你很好的集群。
在上述答案和评论的帮助下,我注意到原始空间中存在异常值和噪声问题。为此,我们应该使用降维方法来消除数据中不必要的噪声。我先尝试了随机投影,但它无法处理文本数据,只是因为问题仍未解决。然后利用截断奇异值分解,得到了完全一致的簇。因此,在我看来,截断SVD是处理文本数据的方法。