聚类分析原理及分析
常用的聚类方法有:系统聚类和K-Means聚类
系统聚类可用hclust()函数实现,
涉及的参数有
1、距离矩阵(dist)-------
2、系统聚类的方法
-------------最短距离法、最长距离法、类平均法、中间距离法、重心法、Ward法
k-means聚类可用kmeans()函数实现
涉及的主要参数为聚类数k
区别:
k-means与系统聚类的不同为:系统聚类对不同的类数产生一系列的聚类结果,而k均值法只能产生指定类数的聚类结果。
k-means类数的确定一般3-5,有时可借助系统聚类法,以一部分样本为对象进行聚类,其结果作为k均值法的类数参考。
################################################
与分类不同,聚类是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法。
聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度将它们划分为若干组,划分的原则是组内最小化而组间距离最大化。
##############################################
常用聚类方法
划分(分裂)方法
层次分析方法
基于密度的方法
基于网格的方法
基于模型的方法
##############################################
常用聚类分析算法
kmeans kmeans() stats
k-中心点 pam() cluster
系统聚类 hcluster()
密度聚类 dbscan() fpc
EM聚类 Mclust() mclust
*******************************************************
聚类算法评价
1)purity
2)RI评价法
3)F值
################################聚类的实例-iris数据集-
################################150个样本,5个变量---前4个为数值变量,最后一个为分类变量,表示鸢尾花的种属
1、层次聚类(系统聚类) stats hclust()
1)每个样本单独作为一类
2)将不同类之间距离最近的进行合并,合并后重新计算类间间距
3)repeat 直到所有的样本归为一类为止。
2、合并类间间距的距离:
1)最短距离法
2)最长距离法
3)类平均法
4)重心法
5)中间距离法
6)离差平方和法
#########here
首先提取iris数据的4个数值变量,标准化之后计算其欧氏距离矩阵(纯数值型例子)
data <- iris[,-5]
#scale() 0-均值规范化
means <- sapply(data,mean);SD <- sapply(data,sd)
dataScale <- scale(data,center=means,scale=SD)
#欧氏距离
Dist <- dist(dataScale,method="euclidean")
heatmap(as.matrix(Dist),labRow=FALSE,labcol=FALSE)
颜色越深表示,样本间距离越近,大致可分为3-4个区块,其样本之间距离比较近。
#ward.D2是离差平方和法
clusteModel <- hclust(Dist,method="ward.D2")
result <- cutree(clusteModel,k=3)
table(iris[,5],result)
#virginica分错了23个样本
result
1 2 3
setosa 49 1 0
versicolor 0 27 23
virginica 0 2 48
plot(clusteModel)
层次聚类特点:
1、基于距离矩阵进行聚类,不需要原始数据;
2、可用于不同形状的聚类,但对于异常点比较敏感;
3、对于数据规模较小的数据比较合适,否则计算量可能会相当大;
4、聚类前无需指定聚类个数,之后切分组数可根据业务知识,也可根据聚类树图的特征
如果样本量很大,可尝试fastcluster包进行快速层次聚类
library(proxy)
res <- dist(data,method="cosine")
#如果是二分类变量(0,1),可采用Jaccard方法计算它们之间的距离
#表示没运行出来。。。。。。
x <- c(0,0,1,1,1,1)
y <- c(1,0,1,1,0,1)
dist(rbind(x,y),method="Jaccard")
#如果是处理多个取值的分类变量,可以将其转为多个二分类变量,其方法和线性回归中将因子变量转换为哑变量是一样的做法
#还有一种特殊情况,分类变量和数值变量混在一起,
#可以先用离差计算单个特征的距离,再进行合并计算
#3,5为数值,其他为2分量,还有一个缺失值
x <- c(0,0,1.2,1,0.5,1,NA)
y <- c(1,0,2.3,1,0.9,1,1)
d <- abs(x-y)
sidt <- sum(d[!is.na(d)])/6
########################################k-means聚类---动态聚类
1、指定聚类的分类个数k
2、先随机取k个点作为初始的类中心,或者说是质心
3、计算各样本点与类中心的距离,并就近归类
4、所有样本完成归类后,重新计算类中心,
5、repeat 直到类中心不再变化
kmeans参数:
x:设置要聚类的数据对象---------并非距离矩阵
centers:用来设置分类个数
nstart:用来设置取随机初始中心的次数,默认值为1,取较多的次数可以改善聚类效果
如果需要定义距离(非欧氏距离),可使用cluster包中的pam函数,配合proxy包来计算
clusteModel <- kmeans(dataScale,centers=3,nstart=10)
class(clusteModel)
library(proxy)
library(cluster)
clusteModel <-pam(dataScale,k=3,metric="manhattan")
clusteModel$medoids
table(iris$Species,clusteModel$clustering)
par(mfcol=c(1,2))
plot(clusteModel,which.plots=2,main="")
plot(clusteModel,which.plots=1,main="")
轮廓系数和成分散点图
轮廓图中各样本点的条状长度为silhouette值,值越大表示聚类效果越好,值越小表示此样本位于两个类的边缘交接地带
k-means函数和pam函数略有区别,
kmeans的类中心不属于原数据中的某个样本,而pam的类中心是数据中的某一个样本
注意:
使用kmeans时要注意,最初的类中心是通过随机生成的,这样有可能会造成较差的聚类结果。
改进的方法:多次尝试聚类。
抽样后先使用层次聚类确定初始类中心
选择比较大的k值聚类,之后手工合并相近的类
采用两分法k均值聚类
对数据进行降维后再实施聚类
(聚类效果可以参考轮廓系数加以判断,轮廓系数考虑了组内的凝聚度和组间的分离度,由此来判断聚类的优良性,其值在-1,1之间取值,值越大表示聚类效果越 好)
rinds提供了一个自定义的简单函数bestCluster,输入数据和一个整数向量,可以自动输出轮廓系数最优的聚类数
fpc包中的kmeansruns函数也可以自动探测最佳的聚类数
其他聚类方法: clusters包
agnes函数-------------------------凝聚层次聚类
diana函数--------------------------划分层次聚类
fanny函数--------------------------模糊聚类
###############################################
基于密度的聚类
k-means聚类,算法非常简单,而且速度很快,
但是,其缺点在于不能识别非球形的簇,
可以使用DBSCAN-------------基于密度---------寻找那些被低密度区域所分离的高密度
重要概念:
核心点:如果某个点的邻域内的点的个数超过某个阈值,则它是一个核心点,即表示他位于簇的内部
边界点:某个点不是核心点,但落在核心点的邻域内
噪声点:非核心点也非边界点
fps包中的dbscan函数可以实施密度聚类
eps:定义邻域的半径大小
MinPts:定义阈值以判断核心点
噪声点:非核心点也非边界点
基于密度聚类可以对抗噪声,能处理任意形状和大小的簇,可以发现k均值不能发现的簇,
但是对于高维数据,点极为稀疏,密度就很难定义了,而且对于计算资源的消耗也很大
#############################################3
自组织映射SOM
是一种聚类技术及降维可视化技术
SOM保留了原有数据的拓扑结构,
kohonen包可以实施多种SOM算法