标签:
首先,简单介绍下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 #显示每个簇的中中心心中心
标签:
原文地址:http://www.cnblogs.com/JoyHan/p/5647936.html