非层次聚类中clusplot()函数怎么用
这篇文章主要讲解了"非层次聚类中clusplot()函数怎么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"非层次聚类中clusplot()函数怎么用"吧!
k-means算法中选取的是距离均值,那么异常点对其的影响会非常大,很可能这种孤立的点就聚为一类,一个改进的方法就是围绕实际数据的中心点进行划分(partitioning aroundmedoids,PAM),也叫k-medoids clustering。其与k-means算法类似,从所有数据观测点寻找k个代表性的对象或形心点,来反应数据的主体结构,然后将所有观测点分配给每个形心点构建k个分类簇。不断迭代来寻找k个代表对象,来获得最佳的形心点来使得对象间的相异性总和最小。
k-medoids算法是k-means算法的变种,其不一样的地方在于聚类中心的选取。在k-means算法中将聚类中心选取为当前cluster中所有数据点的平均值,也即非真实的数据点;然而k-medoids算法中,将聚类中心也即中心点的选取限制在当前cluster所包含的数据点的集合中,从当前cluster中选取到其他所有点的距离之和最小的点作为中心点。k-means和k-medoids之间的差异就类似于一个数据样本的均值和中位数之间的差异。
cluster包中的pam()函数可以使用原始数据或者距离矩阵进行分析,因此十分方便,还可以通过轮廓宽度值确定最佳的分组数量,而fpc包中的pamk()函数可以自动计算最佳的分类簇数目,实例分析如下所示:
#读取数据data=read.table(file="otu_table.txt", header=TRUE, check.names=FALSE)rownames(data)=data[, 1]data=as.matrix(data[, -1])#将每个样品的物种数据进行总和标准化(即求相对丰度)library(vegan)data=decostand(data, MARGIN=2, "total")*100otu=t(data)#计算距离矩阵otu_dist=vegdist(otu, method="bray", diag=TRUE, upper=TRUE, p=2)#PAM聚类library(fpc)library(cluster)#确定最佳聚类簇数目pambest=pamk(otu_dist)k=pambest$ncotu_pam=pam(otu_dist, k)mycol=c(99,81,503,562,76,96,495,52,619,453,71,134,448,548,655,574,36,544,89,120,131,596,147,576,58,429,386,122,87,404,466,124,463,552,147,45,30,54,84,256,100,652,31,610,477,150,50,588,621)mycol=colors()[mycol]clusplot(otu_pam, color=TRUE, labels=3, lines=0, cex=1, col.clus=mycol[1:k], col.p=otu_pam$clustering)
clusplot()函数可以对聚类结果进行主成分分析并作图,结果如下所示:
根据pamk()函数计算结果最佳聚类簇数目为10,但主成分聚类图显示的聚类簇数目要小于10,可以看到不同算法的差异。我们也可以针对PAM聚类绘制轮廓宽度图,从而帮助挑选最佳聚类簇数目,如下所示:
#绘制轮廓宽度图asw=numeric(nrow(otu))for (i in 2:(length(asw)-1)) { asw[i]=pam(otu_dist, i)$silinfo$avg.width}k.best=which.max(asw)plot(1:length(asw), asw, type="h", main="Silhouette of PAM", lwd=2, xlab="k(number of clusters", ylab="average silhouette")
结果如下所示:
当k=22时取得最高的轮廓宽度,这与事实是相符的,因为我们所用数据的66个样品采自22个样品点,每个点3个平行样。但总体来看,轮廓宽度值很高,因此不一定挑选k=22,这里只是为pamk()函数判断结果作参考。
感谢各位的阅读,以上就是"非层次聚类中clusplot()函数怎么用"的内容了,经过本文的学习后,相信大家对非层次聚类中clusplot()函数怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!