例 2 - hclust 和异常值
通过分层聚类,异常值通常显示为一点聚类。
生成三个高斯分布以说明异常值的影响。
set.seed(656)
x = c(rnorm(150, 0, 1), rnorm(150,9,1), rnorm(150,4.5,1))
y = c(rnorm(150, 0, 1), rnorm(150,0,1), rnorm(150,5,1))
XYdf = data.frame(x,y)
plot(XYdf, pch=20)
构建集群结构,将其拆分为三个集群。
XY_sing = hclust(dist(XYdf), method="single")
XYs3 = cutree(XY_sing,k=3)
table(XYs3)
XYs3
1 2 3
448 1 1
hclust 发现了两个异常值并将其他所有内容放入一个大集群中。要获得真实群集,你可能需要将 k 设置得更高。
XYs6 = cutree(XY_sing,k=6)
table(XYs6)
XYs6
1 2 3 4 5 6
148 150 1 149 1 1
plot(XYdf, pch=20, col=XYs6)
此 StackOverflow 帖子有关如何选择群集数量的一些指导,但请注意层次群集中的此行为。