大家好!在这篇文章中,我将向你展示如何在R中进行层次聚类。
什么是分层聚类?
分层聚类是一种可供选择的方法,它可以自下而上地构建层次结构,并且不需要我们事先指定聚类的数量。
该算法的工作原理如下:
将每个数据点放入其自己的群集中。
确定最近的两个群集并将它们组合成一个群集。
重复上述步骤,直到所有数据点位于一个群集中。
一旦完成,它通常由树状结构表示。
让我们看看分层聚类算法可以做得多好。我们可以使用hclust这个。hclust要求我们以距离矩阵的形式提供数据。我们可以通过使用dist。默认情况下,使用完整的链接方法。
这会生成以下树形图:
从图中我们可以看出,群集总数的最佳选择是3或4:
要做到这一点,我们可以使用所需数量的群集来切断树cutree。
现在,让我们将它与原始物种进行比较。
它看起来像算法成功地将物种setosa的所有花分为簇1,并将virginica分为簇2,但是与花斑杂交有困难。如果你看看显示不同物种的原始图,你可以理解为什么:
让我们看看我们是否可以通过使用不同的连接方法更好。这一次,我们将使用平均连接方法:
这给了我们以下树状图:
我们可以看到,群集数量的两个最佳选择是3或5.让我们用cutree它来将它降到3个群集。
我们可以看到,这一次,该算法在聚类数据方面做得更好,只有6个数据点出错。
我们可以如下绘制它与原始数据进行比较:
这给了我们下面的图表:
内部颜色与外部颜色不匹配的所有点都是不正确聚类的点。
R语言将层次聚类中的树分成簇说明
在聚类树图中可以观测到聚类的层次,但是仍然得不到组的信息,不过我们可以定义一个聚类树图会拥有多少个簇,并控制树的高度以便将树分成不同的组。
操作
接上节的数据hc
将数据分成四组
fit = cutree(hc,4)
检查数据的簇标签
fit
[1] 1 1 2 1 2 1 2 2 1 1 1 2 2 1 1 1 2 1 2 3 4 3 4 3 3 4 4 3 4 4 4 3 3 3 4 4 3 4 4 4 4 4 4 4 3 3 4 4 4 3 4 3 3 4 4 4 3 4 4 3
统计每一个簇中的对象数
table(fit)
fit
1 2 3 4
11 8 16 25
使用红色矩形框可视化矩形的簇
plot(hc,hang = -0.01,cex =0.7)
rect.hclust(hc,k=4,border = "red")
除了使用红色矩形来框来界定簇,还可以使用它对单独某个簇进行标记:
plot(hc,hang = -0.01,cex =0.7)
rect.hclust(hc,k = 4,which = 2,border = "red")
标记特定簇
还可以调用dendextend包,使用不同的颜色来绘制红色矩形框的各个不同聚簇。
根据分支所在的不同簇,对其涂色
library(dendextend)#delete
dend %>% color_branches(k=4) %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")
不同簇不同色
在这些簇周围添加红色矩形框
dend %>% color_branches(k=4) %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")
dend %>% rect.dendrogram(k=4,horiz = TRUE)
最后,在图中添加一条切割线来展示对树的操作结:
dend %>% color_branches(k=4) %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")
dend %>% rect.dendrogram(k=4,horiz = TRUE)
abline(v = heights_per_k.dendrogram(dend)["4"] + .1,lwd = 2,lty = 2,col = "blue")
水平聚类树中绘制分割线
1、常规聚类过程:
(2)首先用dist()函数计算变量间距离
dist.r = dist(data, method=" ")
其中method包括6种方法,表示不同的距离测度:"euclidean", "maximum", "manhattan", "canberra", "binary" or "minkowski"。相应的意义自行查找。
(2)再用hclust()进行聚类
hc.r = hclust(dist.r, method = “ ”)
其中method包括7种方法,表示聚类的方法:"ward", "single", "complete","average", "mcquitty", "median" or "centroid"。相应的意义自行查找。
(3)画图
plot(hc.r, hang = -1,labels=NULL) 或者plot(hc.r, hang = 0.1,labels=F)
hang 等于数值,表示标签与末端树杈之间的距离,
若是负数,则表示末端树杈长度是0,即标签对齐。
labels 表示标签,默认是NULL,表示变量原有名称。labels=F :表示不显示标签。
2、热图聚类过程:
(1)首先用dist()函数计算变量间距离
dist.r = dist(data, method=" ")
(2)用heatmap()函数进行热点图聚类
对于heatmap中具体参数,这里不做过多介绍,可在帮助文档中找说明。除此heatmap函数之外,gplots包中的heatmap.2()函数,也可以做热点图聚类。
heatmap(as.matrix(dist.r))
3、多维标度和聚类的结果:
MDS方法对距离矩阵进行降维,用不同的颜色来表示聚类的结果。
dist.r = dist(data, method=" ")
hc.r = hclust(dist.r)
#cutree函数提取每个样本所属的类别
result = cutree(hc.r,k=4)
#cmdscale数据降维
temp = cmdscale(dist.r, k=2)
x = temp[,1]
y = temp[,2]
#作图
library(ggplot2)
p = ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=3,alpha=0.8,aes(colour = factor(result)))