Spark入门之十:聚类算法之kmeans的简介以及使用

转载 2015年11月17日 17:34:20
  1. 聚类算法

    聚类,Cluster analysis,有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能的相似,簇与簇之间的 object尽可能的相异。聚类算法是机器学习(或者说是数据挖掘更合适)中重要的一部分,除了最为简单的K-Means聚类算法外,较常见的还有:层次 法(CURE、CHAMELEON等)、网格算法(STING、WaveCluster等)等等。

    较权威的聚类问题定义:所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。其中每个子集叫做一个簇。

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

  2. K-Means
    K-Means属于基于平方误差的迭代重分配聚类算法,其核心思想十分简单:
    1. 随机选择K个中心点
    2. 计算所有点到这K个中心点的距离,选择距离最近的中心点为其所在的簇
    3. 简单的采用算术平均数(mean)来重新计算K个簇的中心
    4. 重复步骤2和3,直至簇类不在发生变化或者达到最大迭代值
    5. 输出结果
      K-Means算法的结果好坏依赖于对初始聚类中心的选择,容易陷入局部最优解,对K值的选择没有准则可依循,对异常数据较为敏感,只能处理数值属性的数据,聚类结构可能不平衡。
  3. Spark实现K-Means算法
    测试数据如下:
    0.0 0.0 0.0
    0.1 0.1 0.1
    0.2 0.2 0.2
    9.0 9.0 9.0
    9.1 9.1 9.1
    9.2 9.2 9.2
    如前文所述,测试数据不用带标签,数据分为3个维度。
  4. Scala版本的Spark代码
    package com.eric.spark.mllib.kmeans

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

    /**
    * 该程序主要通过kmeans算法对数据进行分类
    *执行方式:./spark-submit --master=spark://cloud25:7077 --class com.eric.spark.mllib.KMeansSample --executor-memory=2g /opt/cloud/spark-1.4.1-bin-hadoop2.6/lib/spark_scala.jar
    * Created by Eric on 2015/11/12.
    */
    object KMeansSample {
    def main(args: Array[String]) {
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)

    //设置环境
    val sparkConconf=new SparkConf().setAppName("KMeansSample")
    val sparkContext=new SparkContext(sparkConconf)

    //装载数据
    val fileData=sparkContext.textFile("/data/mllib/kmeans_data.txt",1)
    val parseData=fileData.map(record=>Vectors.dense(record.split(" ").map(_.toDouble)))

    //模型训练
    val dataModelNumber=2;
    val dataModelTrainTimes=20
    val model=KMeans.train(parseData,dataModelNumber,dataModelTrainTimes)

    //数据模型的中心点
    // 运行结果:
    // Cluster centers:
    // [0.1,0.1,0.1]
    // [9.1,9.1,9.1]
    println("Cluster centers:")
    for (c <- model.clusterCenters) {
    println(" " + c.toString)
    }

    //使用模型测试单点数据
    //运行结果
    // Vectors 0.2 0.2 0.2 is belongs to clusters:0
    // Vectors 0.25 0.25 0.25 is belongs to clusters:0
    // Vectors 8 8 8 is belongs to clusters:1
    println("Vectors 0.2 0.2 0.2 is belongs to clusters:" + model.predict(Vectors.dense("0.2 0.2 0.2".split(' ').map(_.toDouble))))
    println("Vectors 0.25 0.25 0.25 is belongs to clusters:" + model.predict(Vectors.dense("0.25 0.25 0.25".split(' ').map(_.toDouble))))
    println("Vectors 8 8 8 is belongs to clusters:" + model.predict(Vectors.dense("8 8 8".split(' ').map(_.toDouble))))


    //交叉评估1,只返回结果
    val testdata = fileData.map(s =>Vectors.dense(s.split(' ').map(_.toDouble)))
    val result1 = model.predict(testdata)
    result1.saveAsTextFile("/data/mllib/result1")

    //交叉评估2,返回数据集和结果
    val result2 = fileData.map {
    line =>
    val linevectore = Vectors.dense(line.split(' ').map(_.toDouble))
    val prediction = model.predict(linevectore)
    line + " " + prediction
    }.saveAsTextFile("/data/mllib/result2")

    sparkContext.stop()


    }
    }

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

相关文章推荐

文本聚类——Kmeans

上两篇文章分别用朴素贝叶斯算法和KNN算法对newgroup文本进行了分类测试,本文使用Kmeans算法对文本进行聚类。 1、文本预处理 文本预处理在前面两本文章中已经介绍,此处(略)。 ...

利用word2vec对关键词进行聚类

转载自:http://blog.csdn.net/zhaoxinfan/article/details/11069485 继上次提取关键词之后,项目组长又要求我对关键词进行聚类。说实话,我不太明...

文本分类——NaiveBayes

前面文章已经介绍了朴素贝叶斯算法的原理,这里基于NavieBayes算法对newsgroup文本进行分类测试。 文中代码参考:http://blog.csdn.net/jiangliqing1234/...

Spark MLlib KMeans聚类算法

1.1 KMeans聚类算法 1.1.1 基础理论 KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。然后按平均法重新计算各个簇的质心,从而确定新的簇心。一直...
  • sunbow0
  • sunbow0
  • 2015年05月12日 19:13
  • 6883

离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例

1、KMeans算法 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。...

大数据:Spark mlib(一) KMeans聚类算法源码分析

1. 聚类1.1 什么是聚类?所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用算法将集合D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可...

spark.mllib源码阅读-聚类算法1-KMeans

KMeans聚类是聚类分析比较简单的一种,由于其简单、高效、易于理解实现等优点被广泛用于探索性数据分析中。 关于KMeans算法的介绍、分析的相关文章可谓汗牛充栋,留给我能写的东西并不多了,在这里,我...

使用Orange中的聚类算法KMeans

KMeans是orange中提供的一个用来聚类的类,它是标准k-means的实现。 初始化:  __init__(data=None, centroids=3, maxiters=None, mi...

【C++】实现的kmeans聚类算法

  • 2010年05月22日 09:35
  • 53KB
  • 下载

spark mllib 入门学习(一)--聚类算法

本帖最后由 hero1122 于 2017-7-17 16:32 编辑 1.概述 首先,笔者要先申明,我也是初学机器学习领域的内容,虽然我是从事大数据平台开发的工作,但是工作中确实没有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark入门之十:聚类算法之kmeans的简介以及使用
举报原因:
原因补充:

(最多只允许输入30个字)