(2)计算每一类和其它各类的距离;
(3)把“距离”最短的两类合并成一类,这样类的个数就减少一个;
(4)重复步骤1和步骤2,直到包含所有观测值的类合并成单个类为止。
基于5种营养标准含量(变量)的27种食物(观测)进行层次聚类分析,探索不同食物的相同点与不同点,并分成有意义的类。此处层次聚类算法以平均联动(average)为例。
(1)数据预处理--归一化
(2)计算欧几里得距离
(3)平均联动层次聚类分析
(1)确定聚类个数
NbClust包提供了众多的指数来确定在一个聚类分析里类的最佳数目。
(2)获取最终的聚类方案
由上图,尝试解释每类变量的含义:
K均值聚类为最常见的划分方法。
(1)选择K个中心点(随机选择K个观测),K数值就是我们预期的聚类数。
(2)把每个数据点分配给离它最近的中心点;第一次中心点是随机选择的,但也可以设置参数,选择最优的初始值。
(3)重新计算每类中的点到该类中心点距离的平均值;此时的中心点应该为每一类的均值中心点,对异常值敏感(之后都是如此)
(4)分配每个数据到它最近的中心点;
(5)重复步骤3、4,直到所有的观测值不在被分配或是达到最大的迭代次数(默认10次)
(1)数据预处理:去除第一列干扰数据,并归一化数据。
(2)确定待提取的聚类个数,同样可用NbClust包判断(顺序与层次聚类分析不同,如前所述,层次聚类分析在最后才确定聚类个数)
(3)K均值聚类分析
(4)最后将聚类结果与原始数据标准结果(第一列数据)进行比对,看看分析质量如何。
兰德指数接近0.9,看来K均值聚类算法还不错~
K均值法对均值异常敏感,相比来说,PAM为更稳健的方法。
(1)随机选择K个观测(每个都称为中心点);
(2)计算观测值到各个中心的距离;
(3)把每个观测值分配到最近的中心点;
(4)计算每个中心点到每个观测值的距离的总和(总成本);
(5)选择一个该类中不是中心的点,并和中心点互换;
(6)重新把每个点分配到距它最近的中心点;
(7)再次计算总成本;
(8)若新的总成本比步骤4计算的总成本少,就把新的点作为中心点;
(9)重复步骤5-8,直到中心点不变。
1、常规聚类过程:
(2)首先用dist()函数计算变量间距离
dist.r = dist(data, method=" ")
其中method包括6种方法,表示不同的距离测度:"euclidean", "maximum", "manhattan", "canberra", "binary" or "minkowski"。相应的意义自行查找。
(2)再用hclust()进行聚类
hc.r = hclust(dist.r, method = “ ”)
其中method包括7种方法,表示聚类的方法:"ward", "single", "complete","average", "mcquitty", "median" or "centroid"。相应的意义自行查找。
(3)画图
plot(hc.r, hang = -1,labels=NULL) 或者plot(hc.r, hang = 0.1,labels=F)
hang 等于数值,表示标签与末端树杈之间的距离,
若是负数,则表示末端树杈长度是0,即标签对齐。
labels 表示标签,默认是NULL,表示变量原有名称。labels=F :表示不显示标签。
2、热图聚类过程:
(1)首先用dist()函数计算变量间距离
dist.r = dist(data, method=" ")
(2)用heatmap()函数进行热点图聚类
对于heatmap中具体参数,这里不做过多介绍,可在帮助文档中找说明。除此heatmap函数之外,gplots包中的heatmap.2()函数,也可以做热点图聚类。
heatmap(as.matrix(dist.r))
3、多维标度和聚类的结果:
MDS方法对距离矩阵进行降维,用不同的颜色来表示聚类的结果。
dist.r = dist(data, method=" ")
hc.r = hclust(dist.r)
#cutree函数提取每个样本所属的类别
result = cutree(hc.r,k=4)
#cmdscale数据降维
temp = cmdscale(dist.r, k=2)
x = temp[,1]
y = temp[,2]
#作图
library(ggplot2)
p = ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=3,alpha=0.8,aes(colour = factor(result)))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)