R语言的kmeans客户细分模型聚类
来源Ibourneli(李伯韬)的技术博客
、八、■
前言
kmeans是最简单的聚类算法之一,但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans—般在数据分析前期使用,选取适当的k簇,找到最近的这个平均距离,记作b_i,用于量化簇之间分离度。
对于元素x_i,轮廓系数s_i=(b_i-a_i)/max(a_i,b_i)
计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮
廓系数
从上面的公式,不难发现若s_i小于0,说明x_i与其簇内元
素的平均距离小于最近的其他簇,表示聚类效果不好。如果
a_i趋于0,或者b_i足够大,那么s_i趋近与1,说明聚类效果比较好。
K值选取
在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以
k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,
最后选取轮廓系数最大的值对应的k作为最终的集群数目。
实际应用
下面通过例子(R实现,完整代码见附件)讲解kmeans使
用方法,会将上面提到的内容全部串起来
library(fpc)#("fpc")
data(iris)
head(iris)
加载实验数据iris,这个数据在机器学习领域使用比较频繁,主要是通过画的几个部分的大小,对花的品种分类,实验中需要使用fpc库估计轮廓系数,。
1#0-1正规化数据
<-function(x){
(x-min(x))/(max(x)-min(x))
<-iris[,1:4]
<-(sl=([,1]),
sw=([,2]),
pl=([,3]),
pw=([,4]))
对iris的4个feature做数据正规化,每个feature均是花的某个不为的尺寸。
1#k取2到8,
评估K
2K<-2:8
3round<-30#每次迭代30次,避免局部最优
rst<-sapply(K,function(i){
print(paste("K=",i))
mean(sapply(1:round,function(r){
print(paste("Round",r))
result<-kmeans(,i)
stats<-(dist(),result$cluster)
stats$
}))
})
ylab='
plot(K,rst,type=T,main='轮廓系数与K的关系',轮廓系数')
评估k,由于一般K不会太大,太大了也不易于理解,所以
遍历K为2到8。由于kmeans具有一定随机性,并不是每次都收敛到全局最小,所以针对每一个k值,重复执行30次,取并计算轮廓系数,最终取平均作为最终评价标准,可以看到如下的示意图,当k取2时,有最大的轮廓系数,虽然实际上有3个种类。
1#降纬度观察
<-par(mfrow=c(1,2))
3k=2#根据上面的评估k=2最优
clu<-kmeans(,k)
mds=cmdscale(dist(,method="euclidean"))
plot(mds,col=clu$cluster,main='kmeans聚类k=2',pch
=19)
plot(mds,col=iris$Species,main='原始聚类',pch=19)
par()
聚类完成后,有源原始数据是4纬,无法可视化,所以通过
多维定标(Multidimensionalscaling)将纬度将至2为,查看聚
类效果,如下
可以发现原始分类中和聚类中左边那一簇的效果还是拟合的很好的,右测原始数据就连在一起,kmeans无法很好的区分,需要寻求其他方法。
kmeans最佳实践
随机选取训练数据中的k个点作为起始点
当k值选定后,随机计算n次,取得到最小开销函数值的
k作为最终聚类结果,避免随机引起的局部最优解
手肘法选取k值:绘制出k--开销函数闪点图,看到有明显拐点(如下)的地方,设为k值,可以结合轮廓
R语言的kmeans客户细分模型聚类 来自淘豆网m.daumloan.com转载请标明出处.