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)
clustering:使用kmeans拟合后的对象(如result)的cluster(聚类结果),数值型向量(如1 1 1 2 2 3 4 4)
# 基于层次聚类的方法
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;