【问题标题】: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 元素簇通常是异常值。
  • 是的,这正是我一直在想的,因为我怀疑有很多异常值。我想知道哪种算法可能更适合这种情况。

标签: scikit-learn cluster-analysis k-means text-mining tf-idf


【解决方案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 使用当前日期时间作为默认值。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 2016-12-03
      • 2019-06-19
      • 2011-12-24
      • 2016-01-28
      • 1970-01-01
      • 2015-01-24
      • 2010-12-23
      • 2012-09-05
      相关资源
      最近更新 更多