R语言聚类分析案例
在 mclust 包中包含一个 diabetes 数据集(加载 mclust 包后,可通过代码“head(diabetes)”查看数据的前 5 行,通过“?diabetes”查看每个变量的具体意义),该数据集包含 145 名糖尿病患者的三个指标的测量数据,针对该数据集,请进行如下分析:
(1)只考虑 3 个指标数据,使用 k-means 聚类对数据进行聚类分析,找到合适的聚类数目,并对聚类效果进行评估;
######################第五题 聚类分析############################################
library(mclust)
library(MASS)
data(diabetes)
diabetes=diabetes#导入数据
head(diabetes)#观察前五行
?diabetes
结果如下:
> head(diabetes)#观察前五行
class glucose insulin sspg
1 Normal 80 356 124
2 Normal 97 289 117
3 Normal 105 319 143
4 Normal 90 356 199
5 Normal 90 323 240
6 Normal 86 381 157
进行聚类:
km<-kmeans(diabetes[,2:4], 3, nstart = 1)
km
diabetes$cluster<-km$cluster#赋值进去
diabetes
聚类结果如下:
> km
K-means clustering with 3 clusters of sizes 33, 86, 26
Cluster means:
glucose insulin sspg
1 107.42424 531.5455 323.66667
2 91.39535 359.2791 166.72093
3 241.65385 1152.8846 75.69231
Clustering vector:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 1 2 2 2 2 2 1 2 2 1 1 1 1 1 1
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
1 1 1 1 1 2 1 1 1 1 1 1 2 2 2 1 1 1 1 2 1 2 3 3 1 3 3 3 3 3
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
3 3 3 1 3 3 3 3 3 3 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3
Within cluster sum of squares by cluster:
[1] 1058399.6 592025.2 1738796.1
(between_SS / total_SS = 80.5 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss" "size"
[8] "iter" "ifault"
> diabetes
class glucose insulin sspg cluster
1 Normal 80 356 124 2
2 Normal 97 289 117 2
3 Normal 105 319 143 2
4 Normal 90 356 199 2
5 Normal 90 323 240 2
由:Within cluster sum of squares by cluster:[1] 1058399.6 592025.2 1738796.1 (between_SS / total_SS = 80.5 %) 发现聚类效果良好,与原类别标签也较为一致。
(2)在使用系统聚类时,使用不同的距离得到的聚类结果有何异同?
基本思想: 是一类将数据所对应研究对象进行分类的统计方法。它是将个体 (样品)或者对象 (变量)按相似程度(距离远近)划分类别,使得同一类中的元素之间相似性比其他类的元素的相似性更强。目的在于使类间元素的同质性最大化和类与类间元素的异质性最大化。
Q 型聚类分析是指对样本进行聚类,R 型聚类分析是指对变量进行聚类分析。
基本方法:
①系统聚类法:最短距离法、最长距离法、中间距离法、类平均法和离差平方和法等
聚集——开始时将 n 个样品各自作为一类,并规定样品之间的距离和类与类之间的距离,然后将距离最近的两类合并成一个新类,计算新类与其他类的距离;重复进行两个最近类的合并,每次减少一类,直至所有的样品合成一类。
分割——由 n 个样品组成一类开始,按某种最优准则将它分割成两个尽可能远的子类,再
用同样准则将每一子类进一步地分割成两类,从中选一个分割最优地子类,这样将类数由
两类增加到三类。如此下去,直至所有 n 个样品各自为一类或采用某种停止规则。
d <- dist(scale(diabetes[,2:4]))#建立距离矩阵
#不同方法对比
method=c("complete", "average", "centroid", "ward.D")
alldata<-data.frame()
hc<-hclust(d,"complete");
class1<-cutree(hc, k=5) #分成3类
hc<-hclust(d,"average");
class2<-cutree(hc, k=5) #分成3类
hc<-hclust(d,"centroid");
class3<-cutree(hc, k=5) #分成3类
hc<-hclust(d,"ward.D");
class4<-cutree(hc, k=5) #分成3类
alldata<-data.frame(diabetes,class1,class2,class3,class4)#合并为一个数据框
alldata
聚类结果:
> alldata
class glucose insulin sspg cluster class1 class2 class3 class4
1 Normal 80 356 124 2 1 1 1 1
2 Normal 97 289 117 2 1 1 1 1
3 Normal 105 319 143 2 1 1 1 1
4 Normal 90 356 199 2 1 1 1 2
5 Normal 90 323 240 2 1 1 1 2
6 Normal 86 381 157 2 1 1 1 1
7 Normal 100 350 221 2 1 1 1 2
可发现系统聚类法,使用不同的距离方法的时候,聚类结果有所差异,但差异不算特别大。对于两端值分类结果较为良好,但对于类别之间中间值分类较为差。
(3)该数据集的分布情况适合使用密度聚类吗?如果使用密度聚类,聚类的效果是否会比上述的两种聚类方法效果更好?
密度聚类也称为基于密度的聚类,基本出发点是假设聚类结果可以通过样本分布
的稠密程度来确定,主要目标是寻找被低密度区域分离的高稠密区域。它有以下优点:
①相较于 K-means 聚类,DBSCAN 不需要预先声明聚类数量,即聚类数量会根据领域和 MinPts 参数动态确定,从而能更好体现数据的簇分布的原始特征点,但是根据不同参数会得到不同的聚类结果。
②DBSCAN 密度聚类可以找出任何形状的聚类,适用于数据分布形状不规则的数据集。
library(fpc)
model<-dbscan(diabetes[,2:4],eps=50,MinPts=5)
diabetes$dbscan<-model$cluster
## 可视化在不同的eps情况下,聚类的情况
eps <- c(40,50,60,70)
name <- c("one","two","three","four")
dbdata <- diabetes[,2:4]
for (ii in 1:length(eps)) {
modeli <- dbscan(diabetes[,2:4],eps=eps[ii],MinPts=5)
dbdata[[name[ii]]] <- as.factor(modeli$cluster)
}
head(dbdata)
聚类结果如下:
> head(dbdata)
glucose insulin sspg one two three four
1 80 356 124 1 1 1 1
2 97 289 117 1 1 1 1
3 105 319 143 1 1 1 1
4 90 356 199 1 1 1 1
5 90 323 240 1 1 1 1
6 86 381 157 1 1 1 1
........
138 188 958 100 0 0 2 3
139 339 1354 10 0 0 0 0
140 265 1263 83 0 0 0 0
141 353 1428 41 0 0 0 2
142 180 923 77 0 0 2 3
可发现,自动聚类成了3-4类,前三种都是划分为3类,故分为3类较为合理。