我有一个相当大的数据集,包含大约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
DAY
,HOURS
和COUNT
是实数数值,而LOCATION
,M1
,M2
和SOURCE
是数字编码的分类值。
使用统计数据: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)
知道为什么会这样吗?感谢。
答案 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