目录
基础知识
概念:
聚类分析是一种数据归约技术,旨在揭露一个数据集中观测值的子集。例如:对DNA微阵列数据进行聚类分析获得基因表达模型,从而帮助更好的理解疾病的原因;基于抑郁症病人的症状和人口学统计数据对病人进行聚类,试图得出抑郁症的亚型。
聚类的分类:
1.层次聚类:每一个观测值自成一类,这些类每次两两合并,知道所有类被聚成一类。
常用的算法: 单联动(single linkage)、全联动(complete linkage)、平均联动(average linkage)、质心(centroid)和Ward 方法。
2.划分聚类:首先指定类的个数K,然后观测值随机分成K类,再重新形成聚合的类。
常用的算法:K均值(K-means)和围绕中心的划分(PAM)
聚类的步骤:
(1)选择合适的变量
选择你感觉可能对识别和理解数据中不同观测值分组有重要影响的变量
(2)缩放数据
分析中如果选择的变量变化范围很大,那么该变量对结果的影响也是最大的,这是不可取的。最常用的缩放数据的方法是将每个变量的标准化为均值为0标准差为1的变量。其他方法:每个变量被其最大值相除或该变量减去它的平均值并除以变量的平均绝对偏差。
三种方法代码:
df1 <- apply(mydata,2,function(x)((x-mean(x))/sd(x)))
df2 <- apply(mydata,2,function(x)(x/max(x)))
df3 <- apply(mydata,2,function(x)((x-mean(x))/mad(x)))
(3)寻找异常点
聚类分析对异常值非常敏感,可以通过outlier包中的函数筛选和删除异常单变量离群点。mvoutlier包中包含了能识别多元变量的离群点的函数。围绕中心的划分是一种对异常值稳健的聚类方法。
(4)计算距离
需要计算被聚类的实体之间的距离。两个观测值之间最常用的距离量度是欧几里得距离,其他可以选择的量度包括曼哈顿距离、兰氏距离、非对称二元距离、最大距离和闵可夫斯基距离。
(5)选择聚类算法
层次聚类对于小样本来说很实用(如150个观测值或更少),划分的方法能处理更大的数据量,但需要先确定聚类的个数。
(6)获得一种或多种聚类方法
(7)确定类的数目
常用的方法:尝试不同的类数并比较解的质量,NbClust包中NbClust()函数提供30个不同的指标来帮助进行选择。
(8)获得最终的聚类解决方案
(9)结果可视化
层次聚类的结果通常表示为一个树状图,划分聚类的结果通常利用可视化双变量聚类图来表示。
(10)解读类
(11)验证结果
实操
层次聚类
案例:flexclust包中营养数据nutrient作为层次聚类,以期望回答以下问题:
- 基于五种营养标准的27种鱼,禽、肉的相同点和不同点是什么?
- 是否有一种方法将这些食物分成若干个有意义的类?
载入数据:
#install.packages("flexclust")
data(nutrient,package = "flexclust")
head(nutrient)
计算距离:
欧几里得距离:
在图上是用点的 N 个属性构成两个 N 维向量并计算欧几里得距离。
其中,xi1 表示第一个点的第 i 维坐标,xi2 表示第二个点的第 i 维坐标。
欧几里得距离的取值范围是 [0,+∞],数值越小越相似。
dist()函数能用来计算矩阵或数据框的中所有行之间的距离,格式为dist(x,method=),x表示输入数据,默认欧几里得距离。
d <- dist(nutrient)
as.matrix(d)[1:4,1:4]