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

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

--基于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值的选择没有准则可依循,对异常数据较为敏感,只能处理数据属性的数据,聚类结构可能不平衡。

应用数据模型:

机场位置用户识别案例分析 --基于SparkMLlib(K-Means)机器学习_第1张图片

(四)使用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()
  }
}

 

模型训练结果:

机场位置用户识别案例分析 --基于SparkMLlib(K-Means)机器学习_第2张图片

最后保存结果:

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

机场位置用户识别案例分析 --基于SparkMLlib(K-Means)机器学习_第3张图片

(五)结束语

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

你可能感兴趣的:(机场位置用户识别案例分析 --基于SparkMLlib(K-Means)机器学习)