聚类分析的一般步骤:
1.选择合适的变量
2.缩放数据
3.寻找异常点
4.计算距离
5.选择聚类算法
6.获得一种或多种聚类方法
7.确定聚类数目
8.获得最终的聚类解决方案
9.结果可视化
10.解读类
11.验证结果
下面正式开始层次聚类的讲解:
在层次聚类中,起初每一个实例或观测值属于一类,聚类就是每一次把两类聚成新的一类,直到所有的类聚成单个类为止。
(1)定义每个观测值(行或单元)为一类
(2)计算每类和其他各类的距离
(3)把距离最短的两类和并成一类,这样的类的个数就减少一个:
(4)重复步骤(2)(3)
在层次聚类分析中,主要的区别是它们对类的定义不同,下面给出五种常见的聚类方法的定义和其中两类之间距离的定义。
单联动(single)最短距离法:一个类中的点和另一个类中的点的最小距离
全联动(complete):一个类中的点和另一个类中的点的最大距离
平均联动(average):一个类中的点和另一个类中的点的平均距离
质心(centroid):两类中质心(变量均值向量)之间的距离,对单个观测值来说质心就是变量的值
ward法:两个类之间所有变量的方差分析的平方和
层次分析法用函数hclust()函数来实现,格式是:hclust(d,method="")
d:是dist()函数计算出的距离矩阵
method:方法:"single"
"complete"
"average" "centroid"
"ward"
平均联动聚类:
代码:
data(nutrient,package = "flexclust")
>
row.names(nutrient)
>
nutrient.scale
> d
> fit.average
"average")
> plot(fit.average,hang = -1,cex=.8)
如果最终目标是分配到的类较少,我们需要分析聚类的个数
NbClust()函数可以计算适当类的数目
代码:
library(NbClust)
devAskNewPage(ask = TRUE)
nc
"euclidean",min.nc = 2,max.nc = 15,method = "average")
table(nc$Best.nc[1,])
0 1
2 3 4
5 9 10 13 14
15
2 1
4 4 2
4 1 1
2 1
4
barplot(table(nc$Best.nc[1,]))
可以看出类的数目为:2,3,5,15最佳
获得最终的聚类方案:
代码:
barplot(nc$Best.nc)
>
clusters
> table(clusters)
clusters
1
2 3 4
5
7 16
1 2
1
>
aggregate(nutrient,by=list(clusters),median)
Group.1 energy protein fat calcium
iron
1
1 340.0
19
29
9 2.50
2
2 170.0
20
8
13 1.45
3
3 160.0
26
5
14 5.90
4
4 57.5
9
1
78 5.70
5
5 180.0
22
9 367
2.50
>
aggregate(as.data.frame(nutrient.sacle),by=list(cluster=clusters),median)
cluster
energy
protein
fat
calcium
iron
1
1 1.3101024
0.0000000 1.3785620 -0.4480464
0.08110456
2
2 -0.3696099
0.2352002 -0.4869384 -0.3967868
-0.63743114
3
3 -0.4684165
1.6464016 -0.7534384 -0.3839719
2.40779157
4
4 -1.4811842 -2.3520023
-1.1087718 0.4361807
2.27092763
5
5 -0.2708033
0.7056007 -0.3981050 4.1396825
0.08110456
> plot(fit.average,hang = -1,cex=.8)
>
rect.hclust(fit.average,k=5)