K-Means(K均值)

介绍

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

12

10

18

13

115

108

14

3

0

15

52

40

16

62

76

17

73

80

18

45

30

19

1

0

20

180

166

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

把玩家分为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 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)

分类是正确的

三个簇的聚集中心

Spark K-Means的更多相关文章

  1. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  2. 软件——机器学习与Python,聚类,K——means

    K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...

  3. Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

  4. Apache Spark RDD(Resilient Distributed Datasets)论文

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

  5. Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

  6. 快速查找无序数组中的第K大数?

    1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...

  7. spark基础知识介绍2

    dataframe以RDD为基础的分布式数据集,与RDD的区别是,带有Schema元数据,即DF所表示的二维表数据集的每一列带有名称和类型,好处:精简代码:提升执行效率:减少数据读取; 如果不配置sp ...

  8. 网络费用流-最小k路径覆盖

    多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. numpy.ones_like(a, dtype=None, order='K', subok=True)返回和原矩阵一样形状的1矩阵

    Return an array of ones with the same shape and type as a given array. Parameters: a : array_like Th ...

  10. 当我们在谈论kmeans(2)

        本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 其他:建设中- 当我们在谈论kmeans(2 ...

随机推荐

  1. Qt 之 QQ系统表情(五)

    http://blog.csdn.net/goforwardtostep/article/details/52456276

  2. Qt的学习资料比起其它C/C++的GUI组件来说已经算很全的了

    Qt的学习资料比起其它C/C++的GUI组件来说已经算很全的了.Google的话能解决很多问题,如果没搜到资料的话,如果不是问题太过具体或者奇葩,那就是搜索方法的问题.中文教程中,Qt学习之路系列很不 ...

  3. 【Android测试】【随笔】与 “美丽说” 测试同事交流

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5405432.html 分享者简介 雪晗,3年+测试经验,现 ...

  4. php--yii2.0框架的curl

    yii2.0框架的增删改查 //插入操作  save() $customer=new Customer(); $customer->name=‘小熊‘; $customer->save() ...

  5. Object的属性property详细解释(自动生成成员变量)

    类Class中的属性property: 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfac ...

  6. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  7. VMware网络配置 - 三种网络模式简介

    安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其 中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后面会详细介绍 选择虚拟机网络模 式方法如下 ...

  8. [LeetCode]题解(python):049-Groups Anagrams

    题目来源 https://leetcode.com/problems/anagrams/ Given an array of strings, group anagrams together. For ...

  9. Intellij IDEA @Override 标红

    Intellij IDEA 升级到15之后,之前那些@Override 的都标红,提示@Override is not allowed when implement interface method ...

  10. iOS:集成环信EaseMobSDK单聊功能

    当然在集成环信之前需要一些准备操作: 1.首先注册环信开发者账号,直接进入环信官网注册即可:http://www.easemob.com 2.按照文档一步一步将需要的文件全部拖入工程中:http:// ...