聚类分析:聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。 聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。在不同的应用领域,很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中。
聚类的方法: 1、按聚类结果分:覆盖型和非覆盖型,若每个数据点都至少属于一个类,则为覆盖聚类,否则为非覆盖聚类 2、按聚类变量类型分:数值型、分类型和混合型 3、按聚类原理分:分割聚类、层次聚类、基于密度的聚类和网格聚类
数值型观测点与观测点的聚类距离计算方式有很多种,有一篇博文【R语言:计算各种距离】专门介绍,这里只简单的说一下有什么: 欧氏距离(Euclidean):
K-Means聚类: 按上面的划分,它属于覆盖型数值分割聚类,使用R中的经典数据集iris来进行分析。
#使用数据集irisdata(iris)#使用kmeans进行K-Means聚类,K-Means使用的是欧氏距离来计算km<-kmeans(iris[1:4],3)#用table看一下聚类出来的结果和原有分类是否一致table(km$cluster,iris$Species)#结果得出来的分类相对来说较为理想,只有部分重叠了,可以使用fpc包中的plotcluster函数来作图library(fpc)plotcluster(iris[1:4],km$cluster)层次聚类 层次聚类属于覆盖型数值分层聚类,与K-Means不同的是,K-Means是点与点的距离计算,而层次聚类在这基础上,再进行点与小类,小类与小类间距离的测度。 层次聚类需要先计算其距离矩阵,即点与点的测量,距离矩阵的计算方式与K-Means一致,也有欧氏距离等,然后进行点与小类,小类与小类的距离的测量,其计算方式有以下几种: 1、重心法(centroid):观测点与小类的距离,是该观测点与小类重心间的距离 2、最近邻法(single):观测点与小类的距离,是该观测点与小类中所有观测点距离中最小值 3、组间平均链锁法(average):观测点与小类的距离,是该观测点与小类中所有观测点距离的平均值 3、组内平均链锁法(complete):观测点与小类间的距离,是该观测与小类中所有观测点以及自身所在小类内各观测点距离的平均值,即不单计算该观测点与目标小类,还要计算与自身所有小类的各观测点的距离,然后取平均,若该观测点没有被分类,则与组间平均链锁法一致。 4、离差平方和法(ward):使两小类的离差平方和增加最小的先合并。
#同样,先引入iris数据data(iris)#计算观测点距离D<-dist(iris[,1:4])#分类,使用默认方式“complete”,即组内平均链锁法hc<-hclust(D)#在第三层砍树,得到各观测点的第三层分类IDhc.id<-cutree(hc,3)#与原有数据比较table(hc.id,iris$Species)#可以尝试各种距离,看一下哪种距离组合得到的分类与原分类最为吻合hc.id<-cutree(hclust(dist(iris[,1:4],method="euclidean")),3)table(hc.id,iris$Specieshc.id<-cutree(hclust(dist(iris[,1:4],method="maximum")),3)table(hc.id,iris$Species)hc.id<-cutree(hclust(dist(iris[,1:4],method="manhattan")),3)table(hc.id,iris$Species)hc.id<-cutree(hclust(dist(iris[,1:4],method="canberra")),3)table(hc.id,iris$Species)hc.id<-cutree(hclust(dist(iris[,1:4],method="binary")),3)table(hc.id,iris$Species)hc.id<-cutree(hclust(dist(iris[,1:4],method="minkowski")),3)#还有重心法,最近邻法等等,这里不写代码了。简单的聚类分析至此结束,本来还有个两步聚类法,但那个R包“brich”不更新了,只能用旧版的R来运行,就不折腾了。
新闻热点
疑难解答