R语言之聚类

来源:互联网 发布:大话设计模式 java版 编辑:程序博客网 时间:2024/05/17 07:20

利用轮廓系数判断k均值聚类的个数

1、kmeans聚类处理的数据必须是数值型numeric,并且必须是matrxi或者data frame

2、轮廓系数可以使用 fpc包

3、聚类效果没有特殊的评价标准,聚类的个数可以采用这个来判定。

4、聚类个数的其它方法
     亦可采用分层聚类方法,从图形结果划分的类别hclust(见最后)

library(fpc)

data <- iris[,1:4]

定义存放轮廓系数的向量

re<-c()

for(i in2:5) {

result<- kmeans(data,i)

stats<- cluster.stats(dist(data),result$cluster)

re[i]<- stats$avg.silwidth

};

re

final <- which.max(re划分成2个聚类

print(re[final]) 轮廓系数


结果解读:

从结果来看,貌似应该分成2类更加合适(第二个数最大实际数据分为3


# 再练一次

re<-c()

for(iin4:6){

result<-kmeans(data,i)

stats<-cluster.stats(dist(data),result$cluster)

re[i]<-stats$avg.silwidth

}


re

结果解析:

如果聚类指定从4类开始,返回的结果为:

# [1]        NA        NA        NA 0.4965169 0.3711254 0.3599431

从结果看出,前三个NA分别表示了前三个聚类(因为没有参与计算,结果为NA)



fpc包中 关键的函数

cluster.stats(=NULL, clustering, alt.clustering =NULL,

                           noisecluster=FALSE,

                              silhouette =TRUE, G2 =FALSE, G3 =FALSE,

                              wgap=TRUE, sepindex=TRUE, sepprob=0.1,

                              sepwithnoise=TRUE,

                              compareonly =FALSE,

                              aggregateonly =FALSE)

一、输入参数
d : 距离对象(使用dist(data[,"数值型属性"]))

clustering:使用kmeans拟合后的对象(result)cluster(聚类结果),数值型向量(1 1 2 2 3 4 4)

二、返回对象
avg.silwidth:平均轮廓值.(即每一个聚类中心距离之差的平均值)




基于层次聚类的方法


hc <- hclust(dist(data), method="cen"类中心的距离还可以有很多方法 如 ave,median,complete等

绘制聚类结果 (看起来三个效果好一些)

plot(hc);

plot(hchang=-1# hang:负数会在纵坐标0以下,正值则在以上,默认为0.1

然后只取三个聚类 "剪枝"

memb <- cutree(hc, k =3)

memb;

table(membiris[,5]) 判断一下(效果不好)
0 0