首先,简单介绍下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)