您的位置:首页 > 其它

R语言之聚类

2014-04-17 08:39 274 查看
利用轮廓系数判断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(d =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
1 2 2 3 4 4)
二、返回对象
avg.silwidth:平均轮廓值.(即每一个聚类中心距离之差的平均值)

# 基于层次聚类的方法

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

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

plot(hc);

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

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

memb <- cutree(hc, k =3)

memb;
table(memb, iris[,5]) # 判断一下(效果不好)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息