R语言聚类分析案例

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类较为合理。

  • 12
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值