【问题标题】:How to filter out entries that have the same clustering label如何过滤掉具有相同聚类标签的条目
【发布时间】:2018-09-06 15:03:12
【问题描述】:

我想计算我拥有的数据集的两个聚类之间的兰德指数,但我在数据集中有 80,000 个条目,并且到目前为止我发现计算兰德指数的 R 包实际上无法处理这么大的数据集。 (例如,来自 mclust 的错误是Error in table(x, y) : attempt to make a table with >= 2^31 elements

为了减小数据集的大小,我想要做的是过滤掉我的数据集中具有相同聚类标签的整体。例如,如果我有一张桌子

   clusteringA | clusteringB
1       a      |      a
2       b      |      b  
3       c      |      b
4       d      |      c
5       d      |      c
6       e      |      d
7       e      |      e

然后我想做的是过滤掉第 1、4 和 5 行,因为它们将为所有成对比较返回 1。有没有一种计算有效的方法来做到这一点?这样做真的可以让我计算兰德指数吗?

如果不是,我想到的另一种可能性是将我的数据集分成块并在这些块上分别计算兰德指数。这看起来合理吗?我猜这两个聚类之间有相当数量的相等标签分配;前 500 行的 Rand Index 为 1。

【问题讨论】:

  • 我看到删除了 1,可能还有 4 或 5,但为什么 4 5 都删除了?为什么不是 7?
  • 4 和 5 通过方法 A 和 B 一起放置在一个集群中,并且在该集群中没有其他 ID 与它们一起。 7 的情况并非如此。
  • 您能否阐明保留(或不保留)哪些行的逻辑?比如一个伪代码逻辑表达式
  • @DanHall for(i in 1:nrow(df)) { 如果 i$clusteringA 包含与 i$clusteringB 相同的行,则从表中删除 i 和那些行(然后跳过那些被删除的行) } 这有意义吗?

标签: r dataframe cluster-analysis


【解决方案1】:

在聚类中,您不能假设聚类 1 中的标签 a 与聚类中的标签 a 相同。在其他聚类中,这可能是标签 42。

因此,兰德索引直接比较标签,而是比较点对的标签。所以 4 和 5 在聚类 1 中具有相同的标签,它们是一对。它们也是聚类 2 中的一对,因此两个聚类一致认为这些点应该在同一个聚类中。

【讨论】:

  • 是的,这就是为什么我想过滤掉在聚类 1 和 2 中具有相同标签的那些。如果我们要比较我的 80k+ 行数据集的所有对,我将有大约 32 亿对比较。因此,我想过滤掉这些点,因为它们将为包含它们的所有对返回 1,从而导致 m(80k-m+1) 点较少进行比较,其中 m 是具有等效标签的点数。在我的情况下,我认为 m 都很大(至少 n/2),并且我的数据框设置为集群标签都在一起,即第 1 行中的标签 a 不会重新出现在任何其他行中
  • 基本上我只是想要一种计算 80k 点的兰德指数的方法。我正在使用 R,但如果有其他语言的有效方法,我很乐意尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2019-01-23
  • 2016-05-10
  • 2015-04-03
相关资源
最近更新 更多