文章目录
- 聚类分析入门《R语言实战》
聚类分析入门《R语言实战》
(1)聚类分析的一般步骤
(2)计算距离的方法:
①dist(x,method=) 计算矩阵或行列式中所有行观察值的距离,默认距离为欧几里得距离
method =
(默认)euclidean: 欧拉距离
maximum: 距离差值的最大值
manhattan: 距离差值之和
欧几里得计算公式:
library(flexclust)
data <-head(nutrient)
d <- dist(data)
/* 计算得到三角矩阵
BEEF BRAISED HAMBURGER BEEF ROAST BEEF STEAK BEEF CANNED
HAMBURGER 95.64000
BEEF ROAST 80.93429 176.49218
BEEF STEAK 35.24202 130.87784 45.76418
BEEF CANNED 161.22410 65.87868 242.05968 196.42609
CHICKEN BROILED 226.39002 130.76578 307.16015 261.61888 66.06277
*/
as.matrix(d)
/* 转化成矩阵表达式
BEEF BRAISED HAMBURGER BEEF ROAST BEEF STEAK BEEF CANNED
BEEF BRAISED 0.00000 95.64000 80.93429 35.24202 161.22410
HAMBURGER 95.64000 0.00000 176.49218 130.87784 65.87868
BEEF ROAST 80.93429 176.49218 0.00000 45.76418 242.05968
BEEF STEAK 35.24202 130.87784 45.76418 0.00000 196.42609
BEEF CANNED 161.22410 65.87868 242.05968 196.42609 0.00000
CHICKEN BROILED 226.39002 130.76578 307.16015 261.61888 66.06277
*/
(3)层次聚类分析(hierarchical clustering)
①层次聚类函数 hclust(distance,method=)
–distance: 代表观察值的距离,距离在(2)中的dist()方法表示
–method: 层次聚类有5种方法:
single单联动:一个类中的点与另一个类中的点的最小距离
complete全联动:一个类中的点与另一个类中的的点的最大距离
average平均联动:一个类中的点与另一个类中的点的平均距离
centroid质心: 两类间质心的距离
ward法: 两类所有变量方差分析的平方和
data <-nutrien
row.names(data) <-tolower(row.names(data))
//修改数据框中的行列名名称的大小写
d <- dist(data)
//观察点的距离
fit.average <- hclust(d,method="average)
plot(fit.average,hang = -1,cex=.8,main="average Linkage Clustering")
//hang=-1 使标签悬浮在最下方
fit.average <- hclust(d,method="complete")
plot(fit.average,hang = -1,cex=.8,main="complete Linkage Clustering")
fit.average <- hclust(d,method="centroid")
plot(fit.average,hang = -1,cex=.8,main="centroid Linkage Clustering")
②层次聚类算法:
定义每个观察点为一类–>计算观察点距离dist()–>把距离最短的两类合并为一类–>若只剩一类则终止不然循环
③层次聚类的意义:
层次聚类: 根据距离最小值不断地合并,能够得到变量条目之间的相似关系
(3)划分聚类方法
(4)选择类的数目确定最终方案
上述步骤能够直观的表示各个变量的相似性与相异性。但若想要将变量再划分为更少的类型,则需要确定类的数目。
①数目分析函数NbClust(data,distance="",min.nc=,max.nc=,method="")
~distance:距离的计算 ~method:聚类方法的选择
min.nc/max.nc 类分析数目范围
该函数需要包括聚类分析的基本过程,即距离测算聚类方法的选择,最终可以得到不同种聚类方法下,数据支持的数量。选择支持数较大的分类数量进行再划分
②再分配函数
cutree(cluster,k=)
~cluster:初始的聚类模型
~k=:将聚类模型划分为几类
可以得到指定数量下,数据的分配情况
aggregate(data,by=,median)
~by=list():分组依据,且必须是以list形式。
rect.hclust(cluster,k=)
聚类划分函数,将已经产生的聚类cluster的图像根据指定类的数量再进行划分
library(flexclust)
data("nutrient") //导入数据
nutrient.scale <-scale(nutrient) //数据标准化
nb <-NbClust(nutrient.scale,distance="euclidean",min.nc=1,max.nc=15,method="average")
table(nb) //展示每种数量支持情况
/*
0 1 2 3 4 5 9 10 13 14 15
2 1 4 4 2 4 1 1 2 1 4
可知当数量为2,3,5,15时聚类效果较好
*/
//得到初始标准化的聚类模型
d <-distance(nutient.scale) //计算距离
fit.average <-hclust(d,method="average") //得到标准模型
clusters <-cutree(fit.average,k=5) //将初始模型再划分为5类
aggregate(nutrient,by=list(cluster=clusters),median)
/*
cluser 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
依据:cluster聚类模型从1-5的测试点的中位数
*/
plot(fit.average,hang=-1.cex=.8,main="Average Linkage Clustering")
//得到初始聚类模型图像
rect.hclust(fit.average,k=5)
//在上图中在进行类型划分 划分为5种