您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
Spark K-Means
 
作者:lsshlsw 来源:CSDN 发布于:2015-6-16
  2471  次浏览      50
 

介绍

K-Means是被应用的最广泛的基于划分的聚类算法,是一种硬聚类算法,属于典型的局域原型的目标函数聚类的代表。算法首先随机选择k个对象,每个对象初始地代表一个簇的平均值或者中心。对于剩余的每个对象,根据其到各个簇中心的距离,把他们分给距离最小的簇中心,然后重新计算每个簇平均值。重复这个过程,直到聚类准则则函数收敛。准则函数一般采用两种方式:第一种是全局误差函数,第二种是前后两次中心误差变化。

与分类不同,分类是监督学习,要求分类前明确各个类别,并断言每个元素映射到一个类别,而聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。目前聚类广泛应用于统计学、生物学、数据库技术和市场营销等领域,相应的算法也非常的多。

K-Means属于无监督学习,最大的特别和优势在于模型的建立不需要训练数据。在日常工作中,很多情况下没有办法事先获取到有效的训练数据,这时采用K-Means是一个不错的选择。但K-Means需要预先设置有多少个簇类(K值),这对于像计算某省份全部电信用户的交往圈这样的场景就完全的没办法用K-Means进行。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后找出cost最小时所对应的K值,这个值往往能较好的描述有多少个簇类。

运用场景

1.商务上,帮助市场分析人员从客户基本库中发现不同的客户群,并且用购买模式来刻画不同的客户群特征。

2.生物学上,用于推导植物和动物的分类,对基因的分类,获得对种群中固有结构的认识。

3.互联网上,用于对Web上的文档进行分类从而发现信息。

4.对一个游戏中的玩家进行分类(下面的案例)。

工作原理

针对包含n个对象的数据集合D以及初始化的聚类数目k,使用下面的算法。

1.从数据集合D中随机选择k个对象作为初始簇中心。

2.根据簇的中心值,把数据集合中的n个对象全部分给最“相似”的簇(“相似”根据距离长短来判断)。

3.根据簇的中心值,重新计算每个簇的中心值。

4.计算准则函数。

5.若准则函数满足阈值则退出,否则返回第二步继续。

输入数据说明

数据:玩家信息(月)

玩家(ID)
游戏时间(小时)
充值金额(元)
1
60
55
2
90
86
3
30
22
4
15
11
5
288
300
6
223
200
7
0
0
8
14
5
9
320
280
10
65
55
11
13
0

数据抽象为如下,含义为 游戏时间(小时),充值金额(元)

把玩家分为3类:

1.优质用户(高时长,高消费)

2.普通玩家(在线时长中等,消费中等)

3.不活跃用户 (在线时间短,消费低)

流程图

测试代码

import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkConf, SparkContext}

object KMeansTest {
  def main(args: Array[String]) {
      val conf = new SparkConf()
      val sc = new SparkContext(conf)

    val data =sc.textFile(args(0))
    val parsedData =data.map(s => Vectors.dense(s.split(' ').map(_.trim.toDouble))).cache()

    //设置簇的个数为3
    val numClusters =3
    //迭代20次
    val numIterations= 20
    //运行10次,选出最优解
    val runs=10
    val clusters =KMeans.train(parsedData, numClusters, numIterations,runs)
    // Evaluateclustering by computing Within Set Sum of Squared Errors
    val WSSSE = clusters.computeCost(parsedData)
    println("WithinSet Sum of Squared Errors = " + WSSSE)

    val a21 =clusters.predict(Vectors.dense(57.0,30.0))
    val a22 =clusters.predict(Vectors.dense(0.0,0.0))

    //打印出中心点
    println("Clustercenters:");
    for (center <-clusters.clusterCenters) {
      println(" "+ center)
    }

    //打印出测试数据属于哪个簇
    println(parsedData.map(v=> v.toString() + " belong to cluster :" +clusters.predict(v)).collect().mkString("\n"))
    println("预测第21个用户的归类为-->"+a21)
    println("预测第22个用户的归类为-->"+a22)
  }
}

提交代码脚本(standalone模式):

./bin/spark-submit

--name kmeans   \                         (项目名)

--class naiveBayes  \                     (主类名)

--master spark://master:7077  \           (使用集群管理器)

~/Desktop/kmeans.jar     \                  (代码包位置)

Hdfs://master:9000/KMeansTest.data             (args(0)的参数值)

输出结果说明

可以明显的看到:

1类用户为优质用户

2类用户为普通用户

3类用户为不活跃用户

21个用户的数据为(57,30)

22个的用户数据为(0,0)

分类是正确的

三个簇的聚集中心

   
2471 次浏览       50
相关文章

基于EA的数据库建模
数据流建模(EA指南)
“数据湖”:概念、特征、架构与案例
在线商城数据库系统设计 思路+效果
 
相关文档

Greenplum数据库基础培训
MySQL5.1性能优化方案
某电商数据中台架构实践
MySQL高扩展架构设计
相关课程

数据治理、数据架构及数据标准
MongoDB实战课程
并发、大容量、高性能数据库设计与优化
PostgreSQL数据库实战培训
最新课程计划

MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   

并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理

GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...