例 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)

StackOverflow 文档

构建集群结构,将其拆分为三个集群。

    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 文档

StackOverflow 帖子有关如何选择群集数量的一些指导,但请注意层次群集中的此行为。