R语言k-means聚类

轮廓系数

参考https://en.wikipedia.org/wiki/Silhouette_(clustering)

K值选取

在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目。

数据标准化

min.max.norm <- function(x){
  (x-min(x))/(max(x)-min(x))
}
raw.data <- iris[,1:4]
norm.data <- data.frame(sl = min.max.norm(raw.data[,1]),
                        sw = min.max.norm(raw.data[,2]),
                        pl = min.max.norm(raw.data[,3]),
                        pw = min.max.norm(raw.data[,4]))

画轮廓图确定k

# k取2到8,评估K
K <- 2:8
round <- 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='轮廓系数')

通过多维定标进行可视化

old.par <- par(mfrow = c(1,2))
k = 2 # 根据上面的评估 k=2最优
clu <- kmeans(norm.data,k)
mds = cmdscale(dist(norm.data,method="euclidean")) plot(mds, col=clu$cluster, main='kmeans聚类 k=2', pch = 19) plot(mds, col=iris$Species, main='原始聚类', pch = 19) par(old.par)

附录

模式识别之多维定标

在模式识别中,我们会考虑到距离distance的问题,就是一个样本和另一个样本在空间中的距离。根据距离的大小来判断分类。那么,也存在这样的一类问题:我们只知道空间中的点(样本)的距离,那么怎么来重构这些点的相对位置呢?
显然欧式距离是最直观的距离,那么我们就会想使用欧式距离来进行计算重构,我们还希望能够在不同维度上进行重构,比如2维或者3维。
怎么做?
有这么个解决方法叫做MDS 全称为 Multidimensional Scaling。

有一个距离矩阵D,我们试图通过这个距离矩阵计算出点的相对位置矩阵X,使得通过X反过来计算距离矩阵D差距最小。所以这是个最优化问题。
参考http://blog.csdn.net/songrotek/article/details/42235097
wiki:https://en.wikipedia.org/wiki/Multidimensional_scaling

谱聚类

参考http://blog.pluskid.org/?p=287

参考:http://www.cnblogs.com/bourneli/p/3645049.html
wiki对轮廓系数的解释https://en.wikipedia.org/wiki/Silhouette_(clustering)

你可能感兴趣的:(机器学习,R语言,kmeans)