R语言基础R语言收入即学习

R语言入门--第十四节(聚类分析)

2020-02-22  本文已影响0人  小贝学生信

聚类分析(Cluster analysis)是一种数据归约技术,旨在揭露一个数据集中观测值的子集;关于“类”的概念是指由若干个观测值组成的群组。所谓聚类分析就是把大量的观测值归约为若干个类,群组内的观测值间的相似度比群间的观测相似度高。常用的聚类方法有层次聚类、划分聚类,下面一起来学习吧~

层次聚类 hierarchical agglomerative clustering

1、基本概念

2、算法步骤

(1)定义每一个观测值为一类;
(2)计算每一类和其它各类的距离;

(3)把“距离”最短的两类合并成一类,这样类的个数就减少一个;

(4)重复步骤1和步骤2,直到包含所有观测值的类合并成单个类为止。

3、实验示例

基于5种营养标准含量(变量)的27种食物(观测)进行层次聚类分析,探索不同食物的相同点与不同点,并分成有意义的类。此处层次聚类算法以平均联动(average)为例。

注意!在选择变量时,一定要慎重。要选择可能对识别和理解数据中不同观测值分组有重要影响的变量。~以免“烂泥扶不上墙”~

(1)数据预处理--归一化

par(ask=TRUE)
opar <- par(no.readonly=FALSE)
data(nutrient, package="flexclust")   #加载数据包
head(nutrient, 10)
#可以看出energy这一列的数值差异很大,十分影响后几个变量的贡献,因此需要归一化。
nutrient.scaled <- scale(nutrient) 
head(nutrient.scaled, 10)
#这样就舒服很多了
原始nutrient部分数据截图

(2)计算欧几里得距离

d <- dist(nutrient.scaled)
#好像dist还是专门的一种储存格式
as.matrix(d)[1:4,1:4]
#局部查看一下 
as.matrix(d)[1:4,1:4]

(3)平均联动层次聚类分析

fit.average <- hclust(d, method="average")
plot(fit.average, hang=-1, cex=.8, main="Average Linkage Clustering")
#绘树状图图,聚类可视化。
聚类树状图

上图已经足够我们理解27种食物基于营养成分的相似性与差异性,也可进行深入的分析:将27种食物分为较少的、有意义的类。基于此,做如下分析步骤:

(1)确定聚类个数
NbClust包提供了众多的指数来确定在一个聚类分析里类的最佳数目。

library(NbClust)
nc <- NbClust(nutrient.scaled, distance="euclidean", 
              min.nc=2, max.nc=15, method="average")
#直接返回的结论推荐为2
NbClust结论
par(opar)
table(nc$Best.n[1,])
#分别各有四个评判准则赞同聚类个数为2、3、5、15
barplot(table(nc$Best.n[1,]), 
        xlab="Numer of Clusters", ylab="Number of Criteria",
        main="Number of Clusters Chosen by 26 Criteria") 
#将上述结果绘制成柱状图。
26个评判准则的推荐聚类个数

最终的决策聚类方案可以均试一试,选择一个最具有解释意义的聚类方案。下面以聚类数为5,演示一下。(后来自己做了一下聚类数为2的结果,可能理解了教材为什么不用2的原因了;就是树状图最左边的那个食物单分成了一类...)

(2)获取最终的聚类方案

clusters <- cutree(fit.average, k=5) 
table(clusters)
每类观测数
aggregate(nutrient, by=list(cluster=clusters), median) 
aggregate(as.data.frame(nutrient.scaled), by=list(cluster=clusters),
          median)
每类对应变量均值(原数据)
plot(fit.average, hang=-1, cex=.8,  
     main="Average Linkage Clustering\n5 Cluster Solution")
rect.hclust(fit.average, k=5)
5类聚类树状图

由上图,尝试解释每类变量的含义:

划分聚类分析 partitioning clustering

1、基本概念

实验示例为178种意大利葡萄酒(观测)的13种化学成分含量数据(变量)。其实是3类葡萄酒,但是我们假装不知道,看能否分析出来,并且比较两种算法(K均值与PAM)的结果差异。

2、K均值聚类

K均值聚类为最常见的划分方法。

2.1、算法步骤

(1)选择K个中心点(随机选择K个观测),K数值就是我们预期的聚类数。
(2)把每个数据点分配给离它最近的中心点;第一次中心点是随机选择的,但也可以设置参数,选择最优的初始值。
(3)重新计算每类中的点到该类中心点距离的平均值;此时的中心点应该为每一类的均值中心点,对异常值敏感(之后都是如此)
(4)分配每个数据到它最近的中心点;
(5)重复步骤3、4,直到所有的观测值不在被分配或是达到最大的迭代次数(默认10次)

2.2、实验演算

(1)数据预处理:去除第一列干扰数据,并归一化数据。

data(wine, package="rattle")
head(wine)
df <- scale(wine[-1])  

(2)确定待提取的聚类个数,同样可用NbClust包判断(顺序与层次聚类分析不同,如前所述,层次聚类分析在最后才确定聚类个数)

library(NbClust)
set.seed(1234)
nc <- NbClust(df, min.nc=2, max.nc=15, method="kmeans")
par(opar)
table(nc$Best.n[1,])
barplot(table(nc$Best.n[1,]), 
        xlab="Numer of Clusters", ylab="Number of Criteria",
        main="Number of Clusters Chosen by 26 Criteria") 
NbClust()直接结论推荐3个
26个评判准则的推荐聚类个数

因为K值分析在开始时,要随机选择K个中心点,每次可能获得稍有差异的方案。使用set.seed()可以保证结果可复制。
此外,在K均值聚类中,类中总的平方值对聚类数量的曲线可能对确定聚类数量是有帮助的,详见p351

(3)K均值聚类分析

set.seed(1234)
fit.km <- kmeans(df, 3, nstart=25) 

由于聚类方法对初始中心值的选择很敏感,nstart=参数允许尝试多种初始配置并输出最好的一个。比如上例,会生成25个初始配置。

fit.km$size
#三类所包含的样本数
fit.km$centers
#各类中心值(归一化后的数据)
aggregate(wine[-1], by=list(cluster=fit.km$cluster), mean)
#还原数据
各类对应变量中心值

(4)最后将聚类结果与原始数据标准结果(第一列数据)进行比对,看看分析质量如何。

ct.km <- table(wine$Type, fit.km$cluster)
ct.km   
library(flexclust)
randIndex(ct.km)

兰德指数接近0.9,看来K均值聚类算法还不错~

3、基于中心点的划分(PAM)

K均值法对均值异常敏感,相比来说,PAM为更稳健的方法。

3.1、算法步骤

(1)随机选择K个观测(每个都称为中心点);
(2)计算观测值到各个中心的距离;
(3)把每个观测值分配到最近的中心点;
(4)计算每个中心点到每个观测值的距离的总和(总成本);
(5)选择一个该类中不是中心的点,并和中心点互换;
(6)重新把每个点分配到距它最近的中心点;
(7)再次计算总成本;
(8)若新的总成本比步骤4计算的总成本少,就把新的点作为中心点;
(9)重复步骤5-8,直到中心点不变。

3.2、实验演算

library(cluster)
set.seed(1234)
fit.pam <- pam(wine[-1], k=3, stand=TRUE)       
# 进行PAM分析
fit.pam$medoids  
# 查看各类中心值
fit.pam$id.med               
# 查看各类观测数               
clusplot(fit.pam, main="Bivariate Cluster Plot")
# 聚类可视化
PAM算法的三组聚类图
ct.pam <- table(wine$Type, fit.pam$clustering)
ct.pam
randIndex(ct.pam)

由于聚类分析有时也能分析出原本肯定不存在的类,因此需要验证(立方聚类规则,见p356)。此外,要想对自己的聚类结果更自信,可以尝试不同的聚类方法,若同一类持续复原,那么就增加了把握~~~
以上就是聚类分析的R语言学习,参考教材《R语言实战(第2版)》

上一篇下一篇

猜你喜欢

热点阅读