首页 > 编程知识 正文

聚类分析数据标准化,轮廓系数为多少说明聚类有效

时间:2023-05-06 06:11:39 阅读:12121 作者:859

在实际聚类应用中,通常采用k均值和k中心算法进行聚类分析,但这两种算法都需要输入聚类数,为了保证聚类的质量,首先确定最佳聚类数

一种是,用k均值法确定最佳簇数,通常用弯头法确定簇的最佳簇数,肘法有效的是基于增加簇数有助于降低各簇的簇内方差之和的观察

1,使用sjc.elbow()函数计算肘值

sjPlot包中的sjc.elbow ) )函数实现肘方法,并计算k-均值聚类分析的肘值以确定最佳聚类数。

library(SJplot ) sjc.elbow ) data,steps=15,show.diff=FALSE )参数注释:

steps :肘的最大数量show.diff :默认值为FALSE。 创建其他图表,然后连接每个肘部的值以显示肘部值之间的差异。 更改图表有助于识别“肘部”,并暗示“正确”群集数。 sjc.elbow ) )函数用于绘制k均值聚类分析的肘部值。 此函数在指定的数据框中计算k均值聚类分析,并生成两个图表。 一个图表具有不同的肘部值,另一个图表连接y轴上的每个“步长”。 也就是说,在相邻肘部的值之间绘制连接。 第二个图表中的曲线拐点可能会提示“正确”群集数。

绘制k均值聚类分析的肘部值。 此函数计算提供的数据帧的k均值聚类分析,并生成两个图表。 一个具有不同的肘值,另一个绘制在y轴上的每个“步长”(即肘值)之间。 第二张图的增加可能表明了肘部的标准。

从library(effects ) library (SJ plot ) library (gg plot2) sjc.elbow (data,show.diff=FALSE )下肘部值的图形中,曲线的拐点几乎接近5

2,使用NbClust()函数来验证肘值

从上面肘部值的图形中可以看到曲线的拐点为3。 也可以使用NbClust包类型的NbClust ()函数。 默认情况下,此函数提供26个不同的指标,有助于确定群集的最终数量。

NBC lust (数据=null,diss=NULL,distance='euclidean ',min.nc=2,max.nc=15,method=NULL,index='all )

diss :“相位异构矩阵”,默认值为NULL。 如果diss参数不是NULL,则会忽略distance参数。 距离:用于计算异构矩阵的距离测量值。 有效值为“euclidean”、“maximum”、“manhattan”、“canberra”、“binary”、“快速斑马”和“空值”。 如果距离不是NULL,则diss (异相矩阵)参数必须为NULL。 min.nc :最小集群数max.nc :最大集群数method :集群分析中使用的方法。 有效值为' ward.D '、' ward.D2 '、' single '、' complete '、' average '和' average '的' kmeans'index :用于计算的指标。 NbClust ()函数提供30个指数。 默认值为' all ',是指除GAP、Gamma、Gplus和Tau以外的26个指标。 字母:裸指数的显著值使用NbClust ()函数确定k均值聚类的最佳聚类数。

library(NBClust ) NC-NBClust )数据,min.nc=2,max.nc=15,method='kmeans ' ) bar plot (table ) NC $ best.NC 从main=' numberofclusterschosenby 26 Criteria ' )条形图类型可以看出,支持聚类数为3的指标(criteria )数量最多,几乎可以确定

二. k-中心化确定最佳聚类数

k-中心化聚类有两种实现方法。 是PAM和沉默的泥猴桃。 PAM适合在小数据集上运行。 沈静泥猴桃算法基于采样,使用数据集的随机样本,而不是考虑整个数据集,并使用PAM方法计算样本的最佳中心点。

fpc包中的pamk ) )函数获得最佳群集数:

pamk (数据,krange=2:10,criterion='asw ',usepam=TRUE,scaling=FALSE,alpha=0.001,diss=inherits ) )

...)

参数注释:

krange:整数向量,用于表示簇的数量criterion:有效值是:"asw"(默认值)、 "multiasw" 和 "ch"usepam:逻辑值,如果设置为TRUE,那么使用pam算法,如果为FALSE,那么使用平淡的母鸡算法。scaling:逻辑值,是否对数据进行缩放(标准化),如果设置为FALSE,那么不对data参数做任何缩放;如果设置为TRUE,那么对data参数通过把(中间)变量除以它们的均方根来完成缩放。diss:逻辑值,如果设置为TRUE,表示data参数是相异性矩阵;如果设置为FALSE,那么data参数是观测矩阵。

使用pamk()函数获得PAM或沉静的泥猴桃聚类的最佳簇数:

library(fpc)pamk.best <- pamk(dataset)pamk.best$nc

通过cluster包中的clusplot()函数来查看聚类的结果:

library(cluster)clusplot(pam(dataset, pamk.best$nc))

三,评估聚类的质量(轮廓系数)

使用数据集中对象之间的相似性度量来评估聚类的质量,轮廓系数(silhouette coefficient)就是这种相似性度量,是簇的密集与分散程度的评价指标。轮廓系数的值在-1和1之间,该值越接近于1,簇越紧凑,聚类越好。当轮廓系数接近1时,簇内紧凑,并远离其他簇。

如果轮廓系数sil 接近1,则说明样本聚类合理;如果轮廓系数sil 接近-1,则说明样本i更应该分类到另外的簇;如果轮廓系数sil 近似为0,则说明样本i在两个簇的边界上。所有样本的轮廓系数 sil的均值称为聚类结果的轮廓系数,是该聚类是否合理、有效的度量。

1,fpc包

包fpc中实现了计算聚类后的一些评价指标,其中就包括了轮廓系数:avg.silwidth(平均的轮廓宽度)

library(fpc)result <- kmeans(data,k)stats <- cluster.stats(dist(data)^2, result$cluster)sli <- stats$avg.silwidth

2,silhouette()函数

包cluster中计算轮廓系数的函数silhouette(),返回聚类的平均轮廓宽度:

silhouette(x, dist, dmatrix, ...)

参数注释:

x:整数向量,是聚类算法的结果dist:相异性矩阵(是dist()函数计算的结果),如果dist参数不指定,那么dmatrix参数必须指定;dmatrix:对称性的相异性矩阵,用于代替dist参数,比dist参数更有效率

使用silhouette()计算轮廓系数:

library (cluster)library (vegan)#pamdis <- vegdist(data)res <- pam(dis,3) sil <- silhouette (res$clustering,dis)#kmeansdis <- dist(data)^2res <- kmeans(data,3)sil <- silhouette (res$cluster, dis) 四,聚类的可视化

聚类的结果,可以试用ggplot2来可视化,还可以使用的一些聚类包中特有的函数来实现:factoextra包,sjPlot包和cluster包

1,cluster包

clusplot()函数

2,sjPlot包

sjc.qclus()函数

3,factoextra包

该包中的两个函数十分有用,一个用于确定最佳的簇数,一个用于可视化聚类的结果。

(1),确定最佳的簇数fviz_nbclust()

函数fviz_nbclust(),用于划分聚类分析中,使用轮廓系数,WSS(簇内平方误差和)确定和可视化最佳的簇数

fviz_nbclust(x, FUNcluster = NULL, method = c("silhouette", "wss",), diss = NULL, k.max = 10, ...)

参数注释:

FUNcluster:用于聚类的函数,可用的值是: kmeans, cluster::pam, cluster::平淡的母鸡, cluster::fanny, hcut等method:用于评估最佳簇数的指标diss:相异性矩阵,由dist()函数产生的对象,如果设置为NULL,那么表示使用 dist(data, method="euclidean") 计算data参数,得到相异性矩阵;k.max:最大的簇数量,至少是2

 例如,使用kmenas进行聚类分析,使用平均轮廓宽度来评估聚类的簇数:

library(factoextra)fviz_nbclust(dataset, kmeans, method = "silhouette")

(2),可视化聚类的结果

fviz_cluster()函数用于可是化聚类的结果:

fviz_cluster(object, data = NULL, choose.vars = NULL, stand = TRUE, axes = c(1, 2), geom = c("point", "text"), repel = FALSE, show.clust.cent = TRUE, ellipse = TRUE, ellipse.type = "convex", ellipse.level = 0.95, ellipse.alpha = 0.2, shape = NULL, pointsize = 1.5, labelsize = 12, main = "Cluster plot", xlab = NULL, ylab = NULL, outlier.color = "black", outlier.shape = 19, ggtheme = theme_grey(), ...)

参数注释:

object:是聚类函数计算的结果data:原始对象数据集

使用fviz_cluster()把聚类的结果显示出来:

km.res <- kmeans(dataset,3)fviz_cluster(km.res, data = dataset)

参考文档:

确定最佳聚类数目的10种方法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。