16.聚类分析
1.前言
聚类分析是一种数据规约技术,在与揭露一个数据集中观测值的子集,可以把大量的观测值规约为若干个类,而类即是被定义为若干个观测值组成的群组,组内相似度高于组间相似度,即是聚类.最常用的聚类时层次聚类和划分聚类。
层次聚类即是每个观测值自成一类,这些类再两两合并,直到最后只剩下一类。常用的算法有单联动算法,全联动算法,平均联动、质心和word方法。
划分聚类是制定类的K个个数,然后随机分成K类,再重新形成聚合的类。常用的算法是K均值算法和围绕中心点的划分(PAM)。
对flexclust包中的营养数据集nutrient做层次聚类。
解决的问题为:
(1):基于五种营养标准的27类鱼,禽,肉的相同点与不同点
(2):是否有一种方法将这些食物分为若干个有意义的类
另一个问题是用划分聚类分析葡萄酒的化学成分,用rattle包的wine数据,解决的问题有:
(1):意大利葡萄酒样品可否分为更细的类别
(2):若可以,有多少子组?特征分别是什么?
2.聚类分析的一般步骤
(1):选择合适的变量
(2):缩放数据(将每个变量标准化,变为均值为0,标准差为1的变量)
代码实现为:
df1<-apply(mydata,2,function(x){x-mean(x)}/sd(x)))
df2<-apply(mydata,2,function(x){x-mean(x)})
df3<-apply(mydata,2,function(x){(x-mean(x))/mad(x)})
也可以使用scale()函数来讲变量标准化
(3):寻找异常点(采用outliers包中的函数来筛选和删除单变量的离群点,也可用mvoutlier包中包含了能识别多元变量离群点的函数)
(4):计算距离:
(5):选择聚类算法:(层次聚类适用于小样本,划分聚类适合较大的数据量)
(6):获得一种或多种聚类方法
(7):确定聚类数目
(8):得解决方案
(9):结果可视化
(10):解读类
(11):验证结果
3.计算距离
采用的是欧氏距离
R语言实现
data(nutrient,package="flexclust")
head(nutrient,4)
energy protein fat calcium iron
BEEF BRAISED 340 20 28 9 2.6
HAMBURGER 245 21 17 9 2.7
BEEF ROAST 420 15 39 7 2.0
BEEF STEAK 375 19 32 9 2.6
d<-dist(nutrient)
as.matrix(d)[1:4,1:4]