基于r语言的k-means算法实现 海狮 数据挖掘爱好者社区 2018-04-01

原文:https://mp.weixin.qq.com/s/lS9nrrBKCWuXXw1I1fpw4w

k-means算法是聚类分析中一种经典的聚类算法,对于给定的含有N条记录的数据集,算法把数据集分成k组(k<N),使得每一组至少包含一条数据记录,每条记录属于且仅属于一个分组。算法首先会给出一个初始的分组,再经过反复的迭代改变分组,使每一次改变的分组都比上一次好。

    用于衡量好坏的标准通常是:同一分组的记录越接近越好,而不用分组的记录越远越好。

    以下使用k-means 算法对 AirPassengers的年度标准曲线进行聚类分析,从而发现乘客数量的年度变化模式:(下面将提供本次分析的源代码,以及结果的可视化)

源代码:

#笔记:class() str()

ap.data=t( mapply( function(i){ AirPassengers[ ((i-1)*12+1):(i*12) ]},1:12))

#笔记:mapply( function(i){ AirPassengers[ ((i-1)*12+1):(i*12) ]},1:12)是i=1到12 按列排列

#而for(i in 1:12)print( AirPassengers[ ((i-1)*12+1):(i*12) ] )是按行排列,所以对mapply、apply函数需要转置

ap.data.std= t( apply( ap.data,1,function(x){ (x-min(x))/(max(x)-min(x))})) #数据极差正规化变换

#先apply(data,1,fun)按行处理ap.data[1,];即(ap.data[1,]-min(ap.data[1,]))/(max(ap.data[1,])-min(ap.data[1,]))

#再apply输出所默认的从按列排序转置为按行排列t()

#即for(i in 1:12)print((ap.data[i,]-min(ap.data[i,]))/(max(ap.data[i,])-min(ap.data[i,])))

kout= kmeans(  ap.data.std, centers=2, nstart=20, iter.max=200)

table(kout$cluster) #聚类情况

ap.data.std=cbind(ap.data.std,kout$cluster) #类标签

plot( 1:12,1:12,col="white",ylim=c(0,1),xlab="年份",ylab="标准化值")

for (i in 1:nrow(ap.data.std)){ lines( 1:12,ap.data.std[i,1:12], col=ap.data.std[i,13]+2)}

legend(1,1,c("类1","类2"),lty=1,col=c("blue","green"))

从以上的可视化结果可以看出,12条年度曲线被分成了两类,类里面的曲线比较接近,而类间的曲线的差异较大。

    聚类分析在商业应用中,通常用来划分客户群,然后再进行精细化的研究,淘宝,亚马逊,埃森哲这些公司往往都会对客户进行分群管理。

 

Guess you like

Origin blog.csdn.net/weixin_42683052/article/details/106852789