您的位置:首页 > 其它

机场位置用户识别案例分析 --基于SparkMLlib(K-Means)机器学习

2016-04-20 23:30 302 查看

机场位置用户识别案例分析

--基于SparkMLlib(K-Means)机器学习

(一)应用场景简介

网络信令中包含与用户位置相关的实时信息,在经营分析系统中引入网络信令数据,可通过分析客户位置规律,实现基于位置信息的区域业务统计分析。根据网络信令数据的实时特性,可准确地把握营销时机,为客户提供个性化的营销服务,从而提升精细营销服务能力。
Spark在机器学习方面具有得天独厚的优势,MLlib(Machine Learning lib)是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。Spark特别适合用于机器学习的一个原因是基于RDD导致的MLlib的易用性。因此Spark能更好地适用于数据挖掘与机器学习等需要迭代计算的场景。Spark 的 k-means 文本聚类并行化算法,利用 RDD编程模型充分满足了 k-means 频繁迭代运算的需求。
本篇文章试点应用利用SPARK的处理平台和技术,对移动网络信令进行实时采集和分析,从信令中分析在机场、医院等特定场景的用户,识别在机场出现的用户中,乘机外出的用户,为后续针对这部分用户进行营销和服务提供支撑。
在机场出现的用户,可以分为以下几类:
1、机场工作人员以及机场周围的居民
2、前往机场送行的人员、前往机场接机的人员
3、前往机场准备乘机外出的人员
4、乘机归来或外地前来的人员
5、出租车或其他交通运营人员
每种人员有不同的活动规律,系统从基站信令中获取用户的实时位置,通过分析用户位置的变化来对用户进行识别,找出在机场中第三类人员,针对这类人的出行需求进行营销和服务。
第三类人的活动的显著特点有:
1、 在机场位置出现前,在机场外不同位置连续出现
2、不考虑特殊情况,在机场出现的时间应该在10分钟以上,3小时以下
3、在机场出现后,当天没有在同一地市再次出现或在全省没有出现。

(二)机器学习算法简介

K-Means属于无监督学习,最大的特别和优势在于模型的建立不需要训练数据。在日常工作中,很多情况下没有办法事先获取到有效的训练数据,这时采用K-Means是一个不错的选择。K-Means需要预先设置有多少个簇类(K值)。

(三)模拟应用数据

针对以上场景分析,我使用KMeans算法来将数据聚类到5种类簇当中。所需的类簇个数会传递到算法中。然后将计算集内均方差总和,K-Means的核心思想,属于基于平方误差的迭代重分配聚类算法,其核心思想十分简单:
(1)随机选择K个中心点
(2)计算所有点到这K个中心点的距离,选择距离最近的中心点为其所在的簇
(3)简单地采用算术平均数(mean)来重新计算K个簇的中心
(4)重复步骤2和3,直至簇类不再发生变化或者达到最大迭代值
(5)输出结果
K-Means算法的结果好坏依赖于对初始聚类中心的选择,容易陷入局部最优解,对K值的选择没有准则可依循,对异常数据较为敏感,只能处理数据属性的数据,聚类结构可能不平衡。
应用数据模型:



(四)使用Scala编写MLlib中的K-Means案例代码

importorg.apache.log4j.{Level,
Logger}

import org.apache.spark.{SparkConf,
SparkContext}

import org.apache.spark.mllib.clustering.KMeans

import org.apache.spark.mllib.linalg.Vectors

object PortKMeansDemo {

def main(args: Array[String]):
Unit = {

//屏蔽不必要的日志显示在终端上

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)

Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)

// 设置运行环境

val conf =
new SparkConf().setAppName("PortKMeansDemo").setMaster("local[4]")

val sc =
new SparkContext(conf)

//装载数据集

val data = sc.textFile("e:\\port.txt",
1)

val parsedData = data.map(s => Vectors.dense((s.split(","))(1).split('
').map(_.toDouble)))

//将数据集聚类,5个类,20次迭代,形成数据模型

val numClusters =
5

val numIterations =
20

val model = KMeans.train(parsedData,
numClusters,
numIterations)

//数据模型的中心点

println("Cluster centers:")

for (c <- model.clusterCenters) {

println(" " + c.toString)

}

//使用误差平方之和来评估数据模型

val cost = model.computeCost(parsedData)

println("Within Set Sum of Squared Errors ="
+ cost)

//交叉评估2,返回数据集和结果

val result2 = data.map {

line =>

val linevectore = Vectors.dense((line.split(","))(1).split('
').map(_.toDouble))

val prediction = model.predict(linevectore)

line + " " + prediction

}.foreach(println) //.saveAsTextFile("e:\\result")

sc.stop()

}

}

模型训练结果:



最后保存结果:

最后一列代表聚簇 0:代表接送人员 1:机场工作人员 2:出租车司机 3:坐飞机回来人员 4:坐飞机离开人员



(五)结束语

机器学习应用的构建是一个复杂的过程,通常还需要对数据进行预处理,然后特征提取以及数据清洗等,然后才能利用算法来分析数据。由于数据量有限,而且人为捏造数据,故意模型化训练集,与真实环境数据比存在一定偏差,还需要通过海量数据机器学习,得到最优模型。本文也只是初探式的方式解决目前的一些应用场景问题,但效果未必准确有效,毕竟移动信令数据是非常庞大而很难找到较高的模型数据。只是提供了一种解决方案,如果遇到问题或者发现不足之处,请不吝赐教,留言,共同交流学习,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: