【问题标题】:Rclusterpp.hclust not providing correct clusters when using cutree使用 cutree 时,Rclusterpp.hclust 未提供正确的集群
【发布时间】:2018-08-15 20:19:54
【问题描述】:

我有一个相当大的数据集,包含大约 75,000 个观测值和 7 列,其中包含 stats:hclust 无法支持的警报数据详细信息(崩溃 RStudio)。通过几次搜索,我找到了Rclusterpp.hclust,据报道它可以降低层次聚类的复杂性和资源分配,所以我试了一下。大约需要 5 分钟左右,并且确实提供了树状图,但如果我尝试使用 cutree 并指定高度或集群数量,我会得到奇怪的结果。当使用 38 个观察值的小样本时,我看到了同样的问题,如下所示。我做错了什么还是 Rclusterpp.hclust 包有问题? (在 R 3.4.1 中运行包 3.4.1)

示例数据集如下所示:

dataset
#   DAY COUNT LOCATION M1 M2 HOURS SOURCE
#1  238     2   222307  1  1  5437   1008
#2  238     1   222307  2  1  5437   1008
#3  238     5   222307  3  2  5437   1008
#4  238     2   222307  4  3  5437   1008
#5  238    14   222307  5  1  5437   1008
#6  238     4   222307  5  1  5437   1008
#7  238    14   222307  6  2  5437   1008
#8  238     3   222307  1  1  5437   1008
#9  238     1   222307  2  1  5437   1008
#10 238     1   222307  4  3  5437   1008
#11 238     2   222307  4  3  5437   1008
#12 238     2   222307  4  3  5437   1008
#13 238     5   222307  5  1  5437   1008
#14 238    11   222307  5  1  5437   1008
#15 238     1   222307  5  1  5437   1008
#16 238     3   222307  5  1  5437   1008
#17 238    18   222307  6  2  5437   1008
#18 238     2   222307  7  4  5437      9
#19 238     2   222307  8  4  5437     10
#20 238     3   222307  9  5  5437   1008
#21 238     2   222307 10  6  5437    865
#22 238     9   222307 11  7  5437     10
#23 238     2   222307 12  7  5437     10
#24 238     1   222307 12  7  5437     10
#25 238     5   222307 11  7  5437     10
#26 238     2   222307  8  4  5437     10
#27 238     3   222307 13  8  5437    864
#28 238     3   222307 14  8  5437    864
#29 238     1   222307 11  7  5437     10
#30 238     3   222307 11  7  5437     10
#31 238     2   222307 15  7  5437     10
#32 238     5   222307 11  7  5437     10
#33 238     2   222307 16  7  5437     10
#34 238     2   222307 17  7  5437     10
#35 238     3   222307 18  7  5437     10
#36 238     2   222307 15  7  5437     10
#37 238     6   222307 11  7  5437     10
#38 238     3   222307 19  7  5437     10

DAY,HOURSCOUNT 是实数值,而 LOCATION,M1,M2SOURCE 是数字编码的分类值。

使用 stats:hclust 我可以得到一个集群,它可以很好地代表数据,并且可以按预期区分该样本中所有观察值中的 2 个主要警报事件集群(即,树状图中的观察值是应该分组的警报一起):

d1 <- dist((as.matrix(scale(dataset))))
hc1 <- hclust(d1, method = "single")
cutree(hc1,2)
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #27 28 29 30 31 32 33 34 35 36 37 38 
# 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  2  2  1  1  2  2  2  2  2  #1  1  2  2  2  2  2  2  2  2  2  2 
plot(hc1)

但是,如果我在 Rclusterpp:hclust 中执行相同操作,我会得到比我指定的更多的集群(在这种情况下,当我要求 2 时,我得到了 3,如这个小示例所示)。当我在我的大型数据集上运行它时,我只需要几个就得到了近 20,000 个集群。

d2 <- dist((as.matrix(scale(dataset))))
hc2 <- Rclusterpp.hclust(d2, method = "single")
cutree(hc2,2)
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #27 28 29 30 31 32 33 34 35 36 37 38 
# 1  1  1  1  1  1  1  1  1  1  2  2  1  1  1  1  1  3  3  1  1  3  3  3  3  3  #1  1  3  3  3  3  3  3  3  3  3  3 
plot(hc2)

知道为什么会这样吗?谢谢。

【问题讨论】:

    标签: r cluster-analysis hierarchical-clustering


    【解决方案1】:

    我对此进行了一些研究,似乎Rclusterpp.hclust 的返回值与stats' hclust 没有完全对齐(即merge 矩阵)。

    hclust的文档来看,返回列表的merge组件是:

    一个 n-1 x 2 矩阵。合并的第 i 行描述了聚类步骤 i 中聚类的合并。如果行中的元素 j 为负数,则在此阶段合并观察 -j。如果 j 为正,则合并与在算法的(早期)阶段 j 形成的集群。因此,merge 中的负数表示单例的聚集,正数表示非单例的聚集。

    对于cutreeC 实现,括号中的单词(earlier)似乎很重要。

    查看head(hc2$merge),我们看到以下内容:

         [,1] [,2]
    [1,]   -2   -9
    [2,]  -25  -32
    [3,]  -31  -36
    [4,]  -19  -26
    [5,]   -4    6
    [6,]  -11  -12
    

    所以在第五行,有一个指向第六步的“指针”,它朝着意想不到的方向前进

    如果我们重新排列 merge 组件(交换行和“指针”),看起来还不错:

    # non-generic replacements for specific data example
    hc3 <- hc2
    hc3$merge[5, ] <- c(-11,-12)
    hc3$merge[6, ] <- c(-4,5)
    hc3$merge[13, ] <- c(-10,6)
    cutree(hc3, 2)
    

    您可以编写一个函数来处理merge 矩阵的这种重组,这样事情总是可以按照您的意愿工作(可能是cutree 的包装器)。

    最后注意Github上有一个关于这个的issue,可以在里面找到一些讨论和跨包比较:
    https://github.com/nolanlab/Rclusterpp/issues/4

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多