层次聚类--R

来源:互联网 发布:数据分析在职研究生 编辑:程序博客网 时间:2024/06/12 19:07

层次聚类


层次聚类

层次聚类,又称为系统聚类。聚类首先要清晰地定义样本之间的距离关系,距离较近的为一类,较远的则属于不同的一类。层次聚类的计算步骤是首先将每个样本单独作为一类,然后将不同类之间最近的进行合并,合并后重新计算类间距。这个过程一直持续到将所有样本归为一类为之。
在计算类间距时有6中不同的常用方法:
最短距离、最长距离、类平均、重心、中间距离、离差平方和法。

R中实现的函数是stats包中的hclust。该函数重要的参数包括:
样本间的距离矩阵、以及计算类间距离的方法

看一个例子:
首先提取iris数据中的4个数据变量,标准化后计算其欧式距离矩阵。

data <- iris[,-5]means <- sapply(data,mean);SD <- sapply(data,sd)dataScale <- scale(data,center=means,scale=SD)  #scale 标准化函数Dist <- dist(dataScale,method="euclidean")

根据矩阵绘制热图,从图中可以看出颜色越深表示样本间距离越近,大致上可以区分出三到四个区块,其样本之间距离比较近。

heatmap(as.matrix(Dist),labRow = F,labCol = F)  ###绘制热图

距离矩阵热图

最后使用hclust函数建立聚类模型,将结果存在clusteModel变量中,其中ward参数是将类间距离计算方法设置为离差平方和法。
cutree函数可以提取每个样本所属的类别,如果设置类别为3类

ClusteModel <- hclust(Dist,method = "ward.D")result <- cutree(ClusteModel,k=3)table(iris[,5],result)

观察真实的类别与聚类之间的差别,virginica类错分了23个样本

            result              1  2  3  setosa     49  1  0  versicolor  0 50  0  virginica   0 23 27

画出聚类树图

plot(ClusteModel)

层次聚类图

层次聚类对于数据规模小的数据比较适合
聚类前无需确定聚类个数,之后切分组可根据业务知识/聚类树图特征

若样本量很大,尝试使用fastcluster包进行快速层次聚类

library(fastcluster)ClusteModel <- hclust(Dist,method = "ward.D")

聚类需要将距离矩阵作为输入,所以聚类的关键是距离计算方法的选择,这种选择很大程度地影响聚类的效果,而这种选择往往依赖具体的引用场景。

R中一些常规的距离可以通过dist得到,其他一些比较特殊的距离需要加载proxy包。

若遇到二分类变量,可采用杰卡德(Jaccard)方法计算他们之间的距离。(method=“Jaccard”)