Spark:K-Means||算法原理、K-Means++算法原理--52

原创 2015年07月06日 20:50:37

K-Means||算法原理为:(在基于Spark MLlib中的K-Means算法初始化K个类簇中心时的方法之一,另一种是随机选取K个中心)

1.为每个run的K-Means随机选择一个初中心点,然后再平均随机选择2k个点,每个点被选择的概率和该点到类簇中心的距离成正比;

2.对选出的这2k个点做一次K-Means++,找出k个初始化类簇中心,在这2k个左右的点上基于k初始化类簇中心执行多次Lloyd算法;

3.得到的类簇中心作为最终的初始化类簇中心。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

K-Means++算法原理为:(初始的聚类中心之间的相互距离要尽可能的远)

1.从输入的数据点集合中随机选择一个点作为第一个聚类中心;

2.对于数据集中的每一个点X,计算其与聚类中心的距离D(X);

3.选择一个D(X)最大的点作为新的聚类中心;

4.重复2和3步直到K个聚类中心被选出;

5.利用K个初始聚类中心运行K-Means。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

最近看了下Spark-1.4.0的官方说明整理了一点东西,估计以后用的到

常用的API:

Transformation:

              map(func)、filter(func)、flatMap(func)、mapPartitions(func)、mapPartitionsWithIndex(func)、sample(withReplacement,fraction,seed)、

              union(otherDataset)、intersection(otherDAtaset)、distinct(numTasks)、groupByKey(numTasks)、reduceByKey(func,(numTasks))、

              aggregateByKey(zeroValue)(Seq op,comb op,【numTasks】)、sortByKey(【ascending】,【numTasks】)、join(otherDataset,【numTasks】)、

              Cogroup(otherDataset,【numTasks】)、cartesian(otherDataset)、pipe(command,【envVers】)、coalesce(numParititions)、

              repartition(numParititions)、repartitionAndSortWithinPartitions(partitions)

Actions:

              reduce(func)、collect()、count()、first()、take(n)、takeSample(withReplacement,num,【seed】)、takeOrdered(n,【ordering】)、

              saveAsTestFile(path)、saveAsSequenceFile(path)、saveAsObjectFile(path)、CountByKey()、foreach(func)

///////////////////////////////

Accumulators:

创建一个累加器从一个初始值v通过调用SparkContext.accumulator(v)。任务在集群上运行就可以添加使用add或者+=操作符(在Scala和Python)。然而,他们不能读accumulator的值。只有运行程序时可以读取accumulator的value,使用它value模型。

scala> val accum = sc.accumulator(0, "My Accumulator")
accum: spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
scala> accum.value
res2: Int = 10
object VectorAccumulatorParam extends AccumulatorParam[Vector] {
  def zero(initialValue: Vector): Vector = {
    Vector.zeros(initialValue.size)
  }
  def addInPlace(v1: Vector, v2: Vector): Vector = {
    v1 += v2
  }
}

// Then, create an Accumulator of this type:
val vecAccum = sc.accumulator(new Vector(...))(VectorAccumulatorParam)
val accum = sc.accumulator(0)
data.map { x => accum += x; f(x) }
// Here, accum is still 0 because no actions have caused the `map` to be computed.
/////////////////////////////////////////////////////////////////////////////

常用的Sparkstreaming API:

Transformation of DStream:

            map(func)、flatMap(func)、filter(func)、repertition(numParititions)重新分区、union(otherStream)、count()、reduce(func)、

            countByValue()、reduceByKey(func,【numTasks】)、join(otherStream,【numTasks】)、Cogroup(otherStream,【numTasks】)、

            transform(func)、updateStateByKey(func)

Window Operation:

            window(windowlength,slideInterval)、CountByWindow(windowlength,slideInterval)、reduceByWindow(func,windowlength,slideInterval)、

            reduceByKeyAndWindow(func,windowlength,slideInterval,【numTasks】)、CountByValueAndWindow(windowlength,slideInterval。【numTasks】)

///////////////////////////////////////////////////////////////////////////////

DataFrame和sparkSQL:

DataFrame:是一个以命名列方式组织的分布式数据集,等同于关系型数据库中的一个表;对数据源的支持能力允许应用程序可以轻松的组合来自不同数据源的数据。

DataFrame使用于lazy的方式。

创建一个DataFrame基于JSON文件的内容:

val sc: SparkContext // An existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df = sqlContext.read.json("examples/src/main/resources/people.json")
// Displays the content of the DataFrame to stdout
df.show()
 <div id="tab_scala_2" class="tab-pane active" data-lang="scala"><code class="language-scala" data-lang="scala"><span class="k">val</span> <span class="n">sc</span><span class="k">:</span> <span class="kt">SparkContext</span> <span class="c1">// An existing SparkContext.</span>
<span class="k">val</span> <span class="n">sqlContext</span> <span class="k">=</span> <span class="k">new</span> <span class="n">org</span><span class="o">.</span><span class="n">apache</span><span class="o">.</span><span class="n">spark</span><span class="o">.</span><span class="n">sql</span><span class="o">.</span><span class="nc">SQLContext</span><span class="o">(</span><span class="n">sc</span><span class="o">)</span>

<span class="c1">// Create the DataFrame</span>
<span class="k">val</span> <span class="n">df</span> <span class="k">=</span> <span class="n">sqlContext</span><span class="o">.</span><span class="n">read</span><span class="o">.</span><span class="n">json</span><span class="o">(</span><span class="s">"examples/src/main/resources/people.json"</span><span class="o">)</span>

<span class="c1">// Show the content of the DataFrame</span>
<span class="n">df</span><span class="o">.</span><span class="n">show</span><span class="o">()</span>
<span class="c1">// age  name</span>
<span class="c1">// null Michael</span>
<span class="c1">// 30   Andy</span>
<span class="c1">// 19   Justin</span>

<span class="c1">// Print the schema in a tree format</span>
<span class="n">df</span><span class="o">.</span><span class="n">printSchema</span><span class="o">()</span>
<span class="c1">// root</span>
<span class="c1">// |-- age: long (nullable = true)</span>
<span class="c1">// |-- name: string (nullable = true)</span>

<span class="c1">// Select only the "name" column</span>
<span class="n">df</span><span class="o">.</span><span class="n">select</span><span class="o">(</span><span class="s">"name"</span><span class="o">).</span><span class="n">show</span><span class="o">()</span>
<span class="c1">// name</span>
<span class="c1">// Michael</span>
<span class="c1">// Andy</span>
<span class="c1">// Justin</span>

<span class="c1">// Select everybody, but increment the age by 1</span>
<span class="n">df</span><span class="o">.</span><span class="n">select</span><span class="o">(</span><span class="n">df</span><span class="o">(</span><span class="s">"name"</span><span class="o">),</span> <span class="n">df</span><span class="o">(</span><span class="s">"age"</span><span class="o">)</span> <span class="o">+</span> <span class="mi">1</span><span class="o">).</span><span class="n">show</span><span class="o">()</span>
<span class="c1">// name    (age + 1)</span>
<span class="c1">// Michael null</span>
<span class="c1">// Andy    31</span>
<span class="c1">// Justin  20</span>

<span class="c1">// Select people older than 21</span>
<span class="n">df</span><span class="o">.</span><span class="n">filter</span><span class="o">(</span><span class="n">df</span><span class="o">(</span><span class="s">"age"</span><span class="o">)</span> <span class="o">></span> <span class="mi">21</span><span class="o">).</span><span class="n">show</span><span class="o">()</span>
<span class="c1">// age name</span>
<span class="c1">// 30  Andy</span>

<span class="c1">// Count people by age</span>
<span class="n">df</span><span class="o">.</span><span class="n">groupBy</span><span class="o">(</span><span class="s">"age"</span><span class="o">).</span><span class="n">count</span><span class="o">().</span><span class="n">show</span><span class="o">()</span>
<span class="c1">// age  count</span>
<span class="c1">// null 1</span>
<span class="c1">// 19   1</span>
<span class="c1">// 30   1</span></code>  </div>
JSON数据集可以负载DataFrame。

从spark-1.3.0~spark-1.4.0:新:SQLContext.read(读取数据)、DataFrame.write(写入数据);

                                                    弃用的API:SQLContext.parquetFile、SQLContext.jsonFile;

///////////////////////////////////////////////////////////////////////

Bagle(Pregel on spark):简单的图形处理模型;

版权声明:本文为博主原创文章,未经博主允许不得转载。

kmeans算法详解与spark实战

1.标准kmeans算法kmeans算法是实际中最常用的聚类算法,没有之一。kmeans算法的原理简单,实现起来不是很复杂,实际中使用的效果一般也不错,所以深受广大人民群众的喜爱。 kmeans算法...

Spark下的K-Means算法

Spark下的K-Means算法引言1.1背景由于本人刚刚开始学习Spark平台,希望通过学习基础的Spark机器学习算法的使用来对Spark平台以及Scala语言进行一个简单的了解和使用。在这里我首...

Spark MLlib Kmeans源代码解读(上)

Spark MLlib 源代码解读之Kmeans(上)PS:第一次写博客,希望大家支持,谢谢。基本原理:Kmeans算法的基本思想是:初始随机给定k个簇中心,按照最近邻的点将数据集中所包含的点分给不同...

机器学习算法之K-means-spark

1 聚类简单回顾一下:首先,随机在点群中选取K个点,作为划分聚落的种子点;然后,求点群中所有的点到这K个点的距离;接下来,将离种子点近的点都移动到种子点附近;最后,不断重复第二和第三步,直到没有点需要...

【Spark 机器学习】K-means聚类算法(理论篇)

【机器学习】K-means聚类算法(理论篇) 本博客是【Spark-Python-机器学习】系列的文章。 该系列的文章主要讲解【机器学习】的一些通用算法的原理,并且使用【Python+S...
  • cyh24
  • cyh24
  • 2015年12月31日 23:49
  • 4166

k-means++和k-means||

一、k-means算法缺点: 1、需要提前指定k 2、k-means算法对初始化非常敏感 k-means++主要用来解决第二个缺点 二、k-means++算法原理分析 k-means++算法...

Kmeans原理公式图文详解

在网上查看了些博客,感觉大家都对数学公式的解释的比较晦涩,下面我结合一个非常简单的示意图解释下他的数学公式,理解不到位的请留言。 kmeans是一种聚类算法下面是算法的描述 给定训练样本是每一个 ,即...

spark:聚类分析KMeans--47

监督学习从给定的训练数据集中学习出一个函数(模型),当新的数据到来时,可以根据这个函数(模型)预测结果。监督学习的训练集要求是包括输入和输出,也可以说是特征和目标。训练集中的目标是由人标注(标量) 的...

初试Spark之K-Means聚类算法实现

自学Spark有将近一个月了,一直想找一个稍微复杂点的例子练练手,K均值聚类算法实现是个不错的例子,于是有了这篇博客。 K均值聚类算法的原理本身很简单,大概思想就是:选取初始质心,根据这些质心将样本点...

用Spark实现K-means(scala:面向函数式编程风格)

面向函数式编程,用spark实现Kmeans
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark:K-Means||算法原理、K-Means++算法原理--52
举报原因:
原因补充:

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