在实际聚类应用中,通常采用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.silwidth2,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种方法