Kmeans聚类_R代码

 

首先,简单介绍下k-means聚类:效果简单有效,易于map—reduce化

算法思路:1、选择k个点作为原始的质心(k如何定)

     2、将每个点指派到最近的质心,形成k个簇

     3、重新计算每个簇的质心(x,y坐标的均值)--[新的质心不一定为样本点哦]

     4、迭代2、3步直到簇心收敛于某一个阈值

优缺点:

     1、不太受原始点选择的影响

     2、初始的簇数k到底选几呢(聪明人的方法:先用层次聚类法跑一下呗,看形成几个簇)——>不过听说sass软件对使用此方法的k值选择有很好的帮助

     3、分类的结果还是球形的比较好

     4、离群值干扰较大(记得剔除哦)

 

来吧,我们进入R代码实验一下哦:

prepare:

  rnorm(n,mean=0,sd=1)   ——>  生成N(0,1)的服从正态分布的数,从中随机抽取n个;

  matrix(data, nrow = , ncol = , byrow = F)  ——>  以data数据集生成 几行几列的矩阵,byrow=F默认是按列来排列数据

  rbind()    ——>  纵向合并矩阵,行增加了,列不变

  cbind()    ——>  横向合并矩阵,列增加了,行不变  —— 不过听说效率很低,上面也是哦

 

正式代码: 

用于聚类的数据

1 library()
2 x <- rbind(matrix(rnorm(100, sd = 0.3),ncol = 2),
3                 matrix(rnorm(100,mean = 1 ,sd = 0.3) , ncol = 2) )
4 colnames(x) <- c("x","y")

使用数据集生成聚类

1 cl <- kmeans(x,2) #把数据用kmeans进行聚类,聚成两类

outcome:  

K-means clustering with 2 clusters of sizes 50, 50

Cluster means:  #每个聚类中各个列生成的最终平均值
x y
1 -0.006916551 -0.02923474
2 0.960444585 1.01887784

Clustering vector:
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[29] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
[57] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[85] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Within cluster sum of squares by cluster: #每个聚类内部的距离平方和
[1] 9.319024 8.556416
(between_SS / total_SS = 74.0 %)#组间的距离平方和占了总体距离平方和的74%,也就是说各个聚类间的距离做到了最大

Available components:  #运行kmeans时函数返回的对象所包含的各个组成部分

[1] "cluster" "centers" "totss"
[4] "withinss" "tot.withinss" "betweenss"
[7] "size" "iter" "ifault"

("cluster"是一个整数向量,用于表示记录所属的聚类  
"centers"是一个矩阵,表示每聚类中各个变量的中心点
"totss"表示所生成聚类的总体距离平方和
"withinss"表示各个聚类组内的距离平方和
"tot.withinss"表示聚类组内的距离平方和总量
"betweenss"表示聚类组间的聚类平方和总量
"size"表示每个聚类组中成员的数量)

 

1 #承上使用cl,使用如下命令行可以独立显示聚类后的结果
2 cl$cluster   #显示所有数据所分的类
3 cl$centers  #显示每个簇的中中心心中心

 聚类结果可视化啦:

1 plot(x,col = cl$cluster)
2 points(cl$centers,col=3:4 , pch=8 , cex=2)
3 #pch是画出来的实点的大小;cex是以之前的实点为圆心画出来的半径

可以看到,已经分成了两个簇,簇中心已经画出来了:

 输出聚类结果(并写到文件里面):

1 result = cbind(x , cl$cluster)
2 result
3 write.csv( result , "result.csv")

 

再试着把这个数据集多分几个类

cl<- kmeans(x,6,nstart = 25))
#say nstart=10, that means randomly starts kmeans algorithm 10 
#times and return the best.usually take nstart=20 or 25 unless you
#have very big dataset.
(cl<-kmeans(x,6,nstart = 25)) plot(x,col = cl$cluster) points(cl$centers, col = 6:5:4:3:2:1 , pch=8 , cex=2)

 

posted @ 2016-07-06 19:43  叶乙  阅读(7423)  评论(0编辑  收藏  举报