聚类分析

本文深入探讨了聚类分析,包括系统聚类(如hclust函数实现的最短距离法、最长距离法等)和K-Means聚类。介绍了两者之间的区别,如系统聚类对不同类数产生系列结果,而K-Means只能产生指定类数的结果。此外,还讨论了聚类评价指标和聚类实例,如iris数据集的层次聚类与K-Means聚类效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚类分析原理及分析


常用的聚类方法有:系统聚类和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算法








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值