kmeans

如果是自己写kmeans的话,会怎么写呢?

首先kmeans的算法步骤是

随机选取k个点作为初始的簇心,接着计算各个点到各个簇心的距离,将最近的簇心作为该点的簇心。

接着对相同簇心的点做平均,得到下一个簇心

接着就是不停地迭代,知道收敛为止

那么哪些步骤可以并行计算呢?

这里主要有两部分计算量

第一部分是计算各个点到各个簇心的距离,并选取最短的簇心作为自己的簇心

第二部分是计算每个簇的均值从而获得下个迭代的簇心

目前想到的是:

比如有100w条数据,一共分成10个Partition,需要分成5个簇,那么首先将这个k个簇心分发到这10个Partition中,接着对每个Partition中的数据求到这5个簇心的最短簇心,接着利用reduceByKey计算下一个簇心(reduceByKey会首先计算各个Partition中相同的key值)

好吧,接下来看看spark中是怎么做的

首先KMeans调用了train方法:

  1. def train(
  2. data: RDD[Vector],
  3. k: Int,
  4. maxIterations: Int,
  5. runs: Int,
  6. initializationMode: String): KMeansModel = {
  7. new KMeans().setK(k)
  8. .setMaxIterations(maxIterations)
  9. .setRuns(runs)
  10. .setInitializationMode(initializationMode)
  11. .run(data)
  12. }

所以这里返回的是KMeansModel,这里主要设置了最大的迭代次数,设置簇数目,setRuns是设置并行数,

这里最重要的就是run方法了。

接下来看run

  1. def run(data: RDD[Vector]): KMeansModel = {
  2. if (data.getStorageLevel == StorageLevel.NONE) {
  3. logWarning("The input data is not directly cached, which may hurt performance if its"
  4. + " parent RDDs are also uncached.")
  5. }
  6. // Compute squared norms and cache them.
  7. //求2范数
  8. val norms = data.map(Vectors.norm(_, 2.0))
  9. norms.persist()
  10. //将向量和平方和zip起来
  11. val zippedData = data.zip(norms).map { case (v, norm) =>
  12. new VectorWithNorm(v, norm)
  13. }
  14. //这个是大头
  15. val model = runAlgorithm(zippedData)
  16. //原来还能主动unpersist的,涨姿势了
  17. norms.unpersist()
  18. // Warn at the end of the run as well, for increased visibility.
  19. if (data.getStorageLevel == StorageLevel.NONE) {
  20. logWarning("The input data was not directly cached, which may hurt performance if its"
  21. + " parent RDDs are also uncached.")
  22. }
  23. model
  24. }

这里解释下Vectors.norm(_,2.0)的作用

这里其实是在求2范数,怎么求范数呢?

这是个求P范数

所以这里的2范数其实就是各个维度的属性值平方和的开方

顺便看下norm的源码

  1. def norm(vector: Vector, p: Double): Double = {
  2. require(p >= 1.0, "To compute the p-norm of the vector, we require that you specify a p>=1. " +
  3. s"You specified p=$p.")
  4. val values = vector match {
  5. case DenseVector(vs) => vs
  6. case SparseVector(n, ids, vs) => vs
  7. case v => throw new IllegalArgumentException("Do not support vector type " + v.getClass)
  8. }
  9. val size = values.length
  10. if (p == 1) {
  11. var sum = 0.0
  12. var i = 0
  13. while (i < size) {
  14. sum += math.abs(values(i))
  15. i += 1
  16. }
  17. sum
  18. } else if (p == 2) {
  19. var sum = 0.0
  20. var i = 0
  21. while (i < size) {
  22. sum += values(i) * values(i)
  23. i += 1
  24. }
  25. math.sqrt(sum)
  26. } else if (p == Double.PositiveInfinity) {
  27. var max = 0.0
  28. var i = 0
  29. while (i < size) {
  30. val value = math.abs(values(i))
  31. if (value > max) max = value
  32. i += 1
  33. }
  34. max
  35. } else {
  36. var sum = 0.0
  37. var i = 0
  38. while (i < size) {
  39. sum += math.pow(math.abs(values(i)), p)
  40. i += 1
  41. }
  42. math.pow(sum, 1.0 / p)
  43. }
  44. }

额,似乎没啥好说的,一般来说用1,2,正无穷范数比较多,所以这里单独列出这三个来了。

接下来就主要分析runAlgorithm这个函数(话说这名字取得有点粗糙啊,你runKmeans都比这个好)

这个函数主要的工作就我上面说的那样,只是里面加了一些东西,不太理解。

时间: 2024-10-18 09:19:53

kmeans的相关文章

【转】 聚类算法-Kmeans算法的简单实现

1. 聚类与分类的区别: 首先要来了解的一个概念就是聚类,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它"这个东西被分为某某类"这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行"学习",从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做 supervised learning (监督学习),而在聚类的时候,我们并不关心某一类是什么,我们需

EM算法(1):K-means 算法

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解 EM算法(1) : K-means算法 1. 简介 K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成.这个类的个数一般是认为给定的. 2. 原理 假设给定一个数据集$\mathbf{X} = \{\mathbf{x}_1, \mathbf{x}_2,...,\mathbf{x}_N \}$, 和类的个数K.我们的每个类都用一个中心点$

学习笔记:聚类算法Kmeans

前记 Kmeans是最简单的聚类算法之一,但是运用十分广泛,最近看到别人找实习笔试时有考到Kmeans,故复习一下顺手整理成一篇笔记.Kmeans的目标是:把n 个样本点划分到k 个类簇中,使得每个点都属于离它最近的质心对应的类簇,以之作为聚类的标准.质心,是指一个类簇内部所有样本点的均值. 算法描述 Step 1. 从数据集中随机选取K个点作为初始质心         将每个点指派到最近的质心,形成k个类簇 Step 2. repeat             重新计算各个类簇的质心(即类内部

K-Means聚类

聚类(clustering) 用于找出不带标签数据的相似性的算法 K-Means聚类算法简介 与广义线性模型和决策树类似,K-Means参 数的最优解也是以成本函数最小化为目标.K-Means成本函数公式如下: 成本函数是各个类畸变程度(distortions)之和.每个类的畸变程度等于 该类重心与其内部成员位置距离的平方和.若类内部的成员彼此间越紧凑则类的畸变程度越小,反 之,若类内部的成员彼此间越分散则类的畸变程度越大.求解成本函数最小化的参数就是一个重复配 置每个类包含的观测值,并不断移动

机器学习文本挖掘之spherical k-means algorithm初识

Spherical K-Means 法によるクラスタ分析の実験検証 1.1研究背景.目的: インターネットの普及などにより.膨大なデータの中からデータ間の関係を見つけ出したり.有用な情報をを取り出すためにクラスタリングを行われている. { 本研究では.データマイニングの手法の一つであるクラスタリングに関して研究を行う.ク ラスタリングとは.様々な数値解析手法の総称であり.それらの目的は多変量データを解析 し.観測データを同一のクラスタごとに分類し.それぞれのクラスタの区別を明確化あるいは 発見す

[数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记录)的集合,将这些对象划分为多个组或者“聚簇”,从而使同组内的对象间比较相似而不同组对象间差异比较大:换言之,聚类算法就是将相似的对象放到同一个聚簇中,而将不相似的对象放到不同的聚簇中.由于在聚类过程中不使用到类别标签,所以相似性的概念要基于对象的属性进行定义.应用不同则相似性规则和聚类算法一般不太

Python—kmeans算法学习笔记

一.   什么是聚类 聚类简单的说就是要把一个文档集合根据文档的相似性把文档分成若干类,但是究竟分成多少类,这个要取决于文档集合里文档自身的性质.下面这个图就是一个简单的例子,我们可以把不同的文档聚合为3类.另外聚类是典型的无指导学习,所谓无指导学习是指不需要有人干预,无须人为文档进行标注. 二.聚类算法:from sklearn.cluster import KMeans def __init__(self, n_clusters=8, init='k-means++', n_init=10,

一种压缩图片的方法---Machine learning 之 K-Means

背景描述: RGB编码:对于一个直接用24bit表示每一个而像素的图像来说,每一个pixel使用8-bit无符号整数(0-255)来表示红or绿or蓝. 压缩目的: 将128x128大小的图片由原来的24bit表示-压缩成->16bit表示每一个像素的图像. 压缩方法: 对于每一个pixel, 使用 K-Means选择16bits来表示原来的24bits.当然,具体是通过计算每一个像素空间的16bits大小的聚类来表示原来的24bits. 实现步骤: 1.将原来的128x128大小的图片读入到一

k-means

https://en.wikipedia.org/wiki/K-means_clustering http://www.cnblogs.com/leoo2sk/archive/2010/09/20/k-means.html http://www.cs.cmu.edu/~guestrin/Class/10701-S07/Slides/clustering.pdf

使用 Spark MLlib 做 K-means 聚类分析[转]

原文地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice4/ 引言 提起机器学习 (Machine Learning),相信很多计算机从业者都会对这个技术方向感到兴奋.然而学习并使用机器学习算法来处理数据却是一项复杂的工作,需要充足的知识储备,如概率论,数理统计,数值逼近,最优化理论等.机器学习旨在使计算机具有人类一样的学习能力和模仿能力,这也是实现人工智能的核心思想和方法.传统的机器学习算法,由于技术和