层次聚类--R

层次聚类


层次聚类

层次聚类,又称为系统聚类。聚类首先要清晰地定义样本之间的距离关系,距离较近的为一类,较远的则属于不同的一类。层次聚类的计算步骤是首先将每个样本单独作为一类,然后将不同类之间最近的进行合并,合并后重新计算类间距。这个过程一直持续到将所有样本归为一类为之。
在计算类间距时有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”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值