Rclusterpp.hclust在使用cutree时不提供正确的簇

时间:2018-03-07 16:30:49

标签: r cluster-analysis hierarchical-clustering

我有一个相当大的数据集,包含大约75,000个观测值和7个列,其中包含stats:hclust无法支持的警报数据详细信息(崩溃RStudio)。从一些搜索中我发现Rclusterpp.hclust报告了降低Hierarchical Clustering的复杂性和资源分配,所以我试了一下。大约需要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

DAYHOURSCOUNT是实数数值,而LOCATIONM1M2SOURCE是数字编码的分类值。

使用统计数据: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)

HC1 Clusters

然而,如果我在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)

HC2 Clusters

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

1 个答案:

答案 0 :(得分:2)

我已经对此进行了一些调查,看来Rclusterpp.hclust的返回值与merge stats'没有完全对齐(wrt。hclust矩阵)。

hclust的文档中,返回列表的merge组件为:

  

n-1乘2矩阵。合并的第i行描述了在聚类的步骤i处的聚类的合并。如果行中的元素j为负,则在此阶段合并观察-j。如果j为正,则合并与在算法的(较早的)阶段j处形成的聚类一起。因此,合并中的否定条目表示单例的聚集,而正条目表示非单一的聚集。

对于C的{​​{1}}实施,似乎括号中的单词(cutree)很重要。

查看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的包装)。

最后请注意,Github上存在一个问题,您可以在其中找到一些讨论和跨包比较:
https://github.com/nolanlab/Rclusterpp/issues/4