您好,欢迎访问三七文档
kmeans聚类:算法收敛:SSE(SumofSquaredError)即误差平方和,用来度量聚类效果。也称畸变函数;SSE计算的就是一个cluster中每个点到质心的平方差,它可以度量聚类的好坏,显然SSE越小,说明聚类效果越好。由于SSE是一个非凸函数,所以SSE不能保证找到全局最优解,只能确保找到局部最优解。但是可以重复执行几次kmeans,选取SSE最小的一次作为最终的聚类结果0-1格式化由于数据之间量纲不同,不方便比较。所以需要将数据统一放到0~1的范围,将其转化为无量纲的纯数值,便于不同单位获或量级的指标能够进行比较和加权。轮廓系数(silhouetteCoefficient):结合了聚类的凝聚度和分离度,用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。(具体公式见上课笔记)注:在实际应用中,由于kmeans一般作为数据预处理,或者用于辅助分类贴标签,所以K一般不会设置很大。可以通过枚举,令K从2到一个固定值如10,在每个K值上重复运行数次kmeans(避免局部最优解),并计算当前K的平均轮廓系数,最后选取耳轮廓系数最大的值对应的K作为最终的集群数目。kmeans方法实践:1.随机选取训练数据中的k个点作为起始点2.当k值选定后,随机计算n次,取得到最小开销函数值的k作为最终聚类结果,避免随机引起的局部最优解3.手肘法选取k值:绘制出k--开销函数闪点图,看到有明显拐点(如下)的地方,设为k值,可以结合轮廓系数。4.k值有时候需要根据应用场景选取,而不能完全的依据评估参数选取。例:画轮廓系数:#k取2到8,评估KK-2:8round-30#每次迭代30次,避免局部最优rst-sapply(K,function(i){print(paste(K=,i))mean(sapply(1:round,function(r){print(paste(Round,r))result-kmeans(norm.data,i)stats-cluster.stats(dist(norm.data),result$cluster)stats$avg.silwidth}))})plot(K,rst,type='l',main='轮廓系数与K的关系',ylab='轮廓系数')例:计算轮廓系数begin=2;length=15;count=50;end=begin+length-1;#结果容器result=c();result[begin:end]=-1;#遍历计算kmeans的轮廓系数library(cluster);qc=read.table(d:/question_cluster.txt,header=T);for(iinbegin:end){#Silhouettecoefficienttmp=c();tmp[1:count]=0;for(jin1:count){kcluster=pam(qc,i);tmp[j]=kcluster$silinfo$avg.width;}result[i]=mean(tmp);}#绘制结果plot(result,type=o,xlab=NumberofCluster,ylab=SilhouetteCoefficient);例:计算SSE#开始与结果边界begin=1;length=15;count=50;end=begin+length-1;#结果容器result=c();result[begin:end]=0;#遍历计算kmeans的SSEqc=read.table(d:/question_cluster.txt,header=T);for(iinbegin:end){#计算SSEtmp=c();tmp[1:count]=0;for(jin1:count){kcluster=kmeans(qc,i);tmp[j]=kcluster$tot.withinss;}result[i]=mean(tmp);}#绘制结果plot(result,type=o,xlab=NumberofCluster,ylab=SumofSquerError);例:根据K的判断,进行验证kc=kmeans(qc,centers=8)eucQcd=dist(qc,method=euclidean)mds=cmdscale(eucQcd)#降到二维,便于画图plot(mds,col=kc$cluster,main=”8clusters”)
本文标题:kmeans聚类
链接地址:https://www.777doc.com/doc-6381406 .html