14.spark mllib之快速入门

简介

??MLlib是Spark提供提供机器学习的库,专为在集群上并行运行的情况而设计。
MLlib包含很多机器学习算法,可在Spark支持的所有编程语言中使用。

??MLlib设计理念是将数据以RDD的形式表示,然后在分布式数据集上调用各种算法。其实,MLlib就是RDD上一系列可供调用的函数的集合。

数据类型

??MLlib包含一些特有的数据类型,位于org.apache.spark.mllib包(Java/Scala)或pyspark.mllib(Python)中。主要的几个类有:

  • Vector

    • 一个本地向量(Local Vector)。索引是从0开始的,并且是整型。而值为 Double 类型,存储于单个机器内。
    • MLlib既支持稠密向量也支持稀疏向量,前者表示向量的每一位都存储,后者只存储非零位以节约空间。
    • 向量可以通过mllib.linalg.Vectors类创建
    • scala
    //创建稠密向量
    scala> val denseVec1 = Vectors.dense(1.0,2.0,3.0)
    denseVec1: org.apache.spark.mllib.linalg.Vector = [1.0,2.0,3.0]
    
    scala> val denseVec2 = Vectors.dense(Array(1.0,2.0,3.0))
    denseVec2: org.apache.spark.mllib.linalg.Vector = [1.0,2.0,3.0]
    
    //创建稀疏向量
    scala> val sparseVec1 = Vectors.sparse(4,Array(0,2),Array(1.0,2.0))
    sparseVec1: org.apache.spark.mllib.linalg.Vector = (4,[0,2],[1.0,2.0])
    • python
    >>> from pyspark.mllib.linalg import Vectors
    >>> den = Vectors.dense([1.0,2.0,3.0])
    >>> den
    DenseVector([1.0, 2.0, 3.0])
    >>> spa = Vectors.sparse(4,[0,2],[1.0,2.0])
    >>> spa
    SparseVector(4, {0: 1.0, 2: 2.0})
  • LabeledPoint
    • 在分类和回归之类的监督式学习(supervised learning)算法中使用。
    • LabeledPoint表示带标签的数据点,包括一个特征向量与一个标签(由一个浮点数表示)。
    • 位于mllib.regression包中
    • scala
    // 首先需要引入标签点相关的类
    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.mllib.regression.LabeledPoint
    
    // 创建一个带有正面标签和稠密特征向量的标签点。
    val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
    
    // 创建一个带有负面标签和稀疏特征向量的标签点。
    val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
    • python
    >>> from pyspark.mllib.regression import LabeledPoint
    >>> from pyspark.mllib.linalg import Vectors
    >>> pos = LabeledPoint(1.0,Vectors.dense([1.0,2.0,3.0]))
    >>> neg = LabeledPoint(0.0,Vectors.dense([1.0,2.0,3.0]))
  • Matrix
    • 矩阵分为稠密矩阵和稀疏矩阵
    • 稠密矩阵的实体值以列为主要次序的形式,存放于单个 Double 型数组内。系数矩阵的非零实体以列为主要次序的形式,存放于压缩稀疏列(Compressed Sparse Column, CSC)中。例如,下面这个稠密矩阵就是存放在一维数组 [1.0, 3.0, 5.0, 2.0, 4.0, 6.0] 中,矩阵的大小为 (3, 2) 。
    • 本地矩阵的基类是 Matrix 类,在 Spark 中有其两种实现,分别是 DenseMatrix 和 SparseMatrix 。官方文档中推荐使用 已在 Matrices 类中实现的工厂方法来创建本地矩阵。需要注意的是,MLlib 中的本地矩阵是列主序的(column-major)
    • 稠密矩阵
      import org.apache.spark.mllib.linalg.{Matrix, Matrices}
      // 创建稠密矩阵 ((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))
      val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
    • 稀疏矩阵
      scala> val sparseMatrix= Matrices.sparse(3, 3, Array(0, 2, 3, 6), Array(0, 2, 1, 0, 1, 2), Array(1.0, 2.0, 3.0,4.0,5.0,6.0))
      sparseMatrix: org.apache.spark.mllib.linalg.Matrix =
      3 x 3 CSCMatrix
      (0,0) 1.0
      (2,0) 2.0
      (1,1) 3.0
      (0,2) 4.0
      (1,2) 5.0
      (2,2) 6.0
  • Rating
    • 用于产品推荐
    • 表示用户对一个产品的评分
    • 位于mllib.recommendation包中
  • 各种Model类(模型)
    • 每个Model都是训练算法的结果
    • 模型一般都有一个predict()方法,使用该模型对新的数据点或数据点组成的RDD进行预测。

统计

??不论是在即时的探索中,还是在机器学习的数据理解中,基本的统计都是数据分析的重要部分。MLlib 通过mllib.stat.Statistics 类中的方法提供了几种广泛使用的统计函数,这些函数可以直接在RDD 上使用。一些常用的函数如下所列。

Statistics.colStats(rdd)

??计算由向量组成的RDD 的汇总统计,保存着向量集合中每列的最小值、最大值、平均值和方差。这可以用来在一次执行中获取丰富的统计信息。

Statistics.corr(rdd, method)

?&esmp;计算由向量组成的RDD 中的列间的相关矩阵,使用皮尔森相关(Pearson correlation)或斯皮尔曼相关(Spearman correlation)中的一种(method 必须是pearson 或spearman中的一个)。

Statistics.corr(rdd1, rdd2, method)

??计算两个由浮点值组成的RDD 的相关矩阵,使用皮尔森相关或斯皮尔曼相关中的一种(method 必须是pearson 或spearman 中的一个)。

Statistics.chiSqTest(rdd)

??计算由LabeledPoint 对象组成的RDD 中每个特征与标签的皮尔森独立性测试
(Pearson’s independence test) 结果。返回一个ChiSqTestResult 对象, 其中有p 值、(p-value)、测试统计及每个特征的自由度。标签和特征值必须是分类的(即离散值)。

??下面举个例子:使用三个学生的成绩Vector来构建所需的RDD Vector,这个矩阵里的每个Vector都代表一个学生在四门课程里的分数:

python

from pyspark.mllib.stat import Statistics
from pyspark.mllib.linalg import Vectors
//构建RDD
basicTestRDD = sc.parallelize([Vectors.dense([60, 70, 80, 0]),
                       Vectors.dense([80, 50, 0,  90]),
                       Vectors.dense([60, 70, 80,  0])])

//查看summary里的成员,这个对象中包含了大量的统计内容
>>> print summary.mean()
[ 66.66666667  63.33333333  53.33333333  30.        ]
>>> print summary.variance()
[  133.33333333   133.33333333  2133.33333333  2700.        ]
>>> print summary.numNonzeros()
[ 3.  3.  2.  1.]

scala

import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD

val array1: Array[Double] = Array[Double](60, 70, 80, 0)
val array2: Array[Double] = Array[Double](80, 50, 0, 90)
val array3: Array[Double] = Array[Double](60, 70, 80, 0)
val denseArray1 = Vectors.dense(array1)
val denseArray2 = Vectors.dense(array2)
val denseArray3 = Vectors.dense(array3)

val seqDenseArray: Seq[Vector] = Seq(denseArray1, denseArray2, denseArray3)

val basicTestRDD: RDD[Vector] = sc.parallelize[Vector](seqDenseArray)

val summary: MultivariateStatisticalSummary = Statistics.colStats(basicTestRDD)

算法

特征提取

  • TF-IDF(词频——逆文档频率)是用来从文本文档(例如网页)中生成特定向量的简单方法。
  • 缩放,大多数要考虑特征向量中各元素的幅值,并且在特征缩放调整为平等对待时表现最好。
  • 规化,在准备输入数据时,把向量正规化为长度1。使用Normalizer类可以实现。
  • Word2Vec是一个基于神经网络的文本特征算法,可以用来将数据传给许多下游算法。

降维

  • 主成分分析(PCA)

    • PCA会把特征映射到低位空间,让数据在低维空间表示的方差最大化,从而忽略一些无用的维度。
    • 要计算这种映射,我们要构建出正规化的相关矩阵,并使用这个矩阵的奇异向量和奇异值。
    • 最大的一部分奇异值相对应的奇异向量可以用来重建原始数据的主要成分。
  • 奇异值分解
    • MLlib也提供底层的奇异值分解(简称SVD)原语。

分类与回归

  • 分类与回归是监督学习的两种形式。
  • 监督学习是指算法尝试使用有标签的训练数据根据对象的特征预测结果。
  • 在分类中,预测出的变量是离散的。
  • 在回归中,预测出的变量是连续的。
  • MLlib中包含许多分类与回归算法:如简单的线性算法以及决策树和森林算法。

聚类

  • 聚类算法是一种无监督学习任务,用于将对象分到具有高度相似性的聚类中。
  • 聚类算法主要用于数据探索(查看一个新数据集是什么样子)以及异常检测(识别与任意聚类都相聚较远的点)。
  • MLlib中包含两个聚类中流行的K-means算法,以及一个叫做K-means||的变种,可以提供为并行环境提供更好的初始化策略。

协同过滤与推荐

  • 协同过滤是一种根据用户对各种产品的交互与评分来推荐新产品的推荐系统技术。
  • 交替最小二乘(ALS),会为每个用户和产品都设一个特征向量,这样用户向量和产品向量的点积就接近于他们的得分。

实例

使用逻辑回归算法实现垃圾邮件分类处理

def testLogisticRegressionWithSGD = {
    val spam = sc.textFile("src/main/resources/mllib/spam.txt", 1)
    val normal = sc.textFile("src/main/resources/mllib/normal.txt", 1)

    //创建一个HashingTF实例来把邮件文本映射为包含一个10000个特征的向量
    val tf = new HashingTF(numFeatures = 10000)
    //各邮件都被切分为单词,每个单词被映射为一个特征
    val spamFeatures = spam.map { email => tf.transform(email.split(" ")) }
    val normalFeatures = normal.map { email => tf.transform(email.split(" ")) }

    //创建LabeledPoint数据集分别存放阳性(垃圾邮件)和阴性(正常邮件)的例子
    val positiveExamples = spamFeatures.map { features => LabeledPoint(1, features) }
    val negativeExamples = normalFeatures.map { features => LabeledPoint(0, features) }
    val trainingData = positiveExamples.union(negativeExamples)
    trainingData.cache()
    println(trainingData.toDebugString)

    //使用SGD算法运行逻辑回归
    val model = new LogisticRegressionWithSGD().run(trainingData)
    //以阳性(垃圾邮件)和阴性(正常邮件)的例子分别进行测试
    val posTest = tf.transform("O M G get cheap stuff by sending money to .".split(" "))
    val negTest = tf.transform("hello, i started studying Spark ".split(" "))
    println(s"prediction for positive tset example: ${model.predict(posTest)}")
    println(s"prediction for negitive tset example: ${model.predict(negTest)}")

    Thread.sleep(Int.MaxValue)
  }

svm分类算法

# 加载模块
from pyspark.mllib.util import MLUtils
from pyspark.mllib.classification import SVMWithSGD

# 读取数据
dataFile = ‘/opt/spark-1.6.1-bin-hadoop2.6/data/mllib/sample_libsvm_data.txt‘
data = MLUtils.loadLibSVMFile(sc, dataFile)

splits = data.randomSplit([0.8, 0.2], seed = 9L)
training = splits[0].cache()
test = splits[1]

# 打印分割后的数据量
print "TrainingCount:[%d]" % training.count();
print "TestingCount:[%d]" % test.count();

model = SVMWithSGD.train(training, 100)

scoreAndLabels = test.map(lambda point : (model.predict(point.features), point.label))

#输出结果,包含预测的数字结果和0/1结果:
for score, label in scoreAndLabels.collect():
    print score, label

k-means聚类算法

# 读取数据文件,创建RDD
dataFile = "/opt/spark-1.6.1-bin-hadoop2.6/data/mllib/kmeans_data.txt"
lines = sc.textFile(dataFile)

# 创建Vector,将每行的数据用空格分隔后转成浮点值返回numpy的array
data = lines.map(lambda line: np.array([float(x) for x in line.split(‘ ‘)]))

# 其中2是簇的个数
model = KMeans.train(data, 2)

print("Final centers: " + str(model.clusterCenters))
print("Total Cost: " + str(model.computeCost(data)))

原文地址:http://blog.51cto.com/12967015/2172878

时间: 2024-12-11 18:12:11

14.spark mllib之快速入门的相关文章

10.spark sql之快速入门

前世今生 Hive&Shark ??随着大数据时代的来临,Hadoop风靡一时.为了使熟悉RDBMS但又不理解MapReduce的技术人员快速进行大数据开发,Hive应运而生.Hive是当时唯一运行在Hadoop上的SQL-on-Hadoop工具. ??但是MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率.为了提高SQL-on-Hadoop的效率,大量的SQL-on-Hadoop工具开始产生,其中表现较为突出的是: MapR的Drill Cloudera的Im

13.spark streaming之快速入门

简介   Spark Streaming是Spark核心API的扩展,可以实现可伸缩.高吞吐量.具备容错机制的实时流时数据的处理.支持多种数据源,比如Kafka.Flume.Twitter.ZeroMQ.Kinesis 以及TCP sockets.   可以使用诸如map.reduce.join和window等高级函数进行复杂算法(比如,机器学习和图计算)的处理.最后还可以将处理结果存储到文件系统,数据库和仪表盘. 架构与抽象 抽象   Spark Streaming接收实时流的数据,并根据一定

Spark入门实战系列--8.Spark MLlib(上)--机器学习及SparkMLlib简介

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.机器学习概念 1.1 机器学习的定义 在维基百科上对机器学习提出以下几种定义: l“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”. l“机器学习是对能通过经验自动改进的计算机算法的研究”. l“机器学习是用数据或以往的经验,以此优化计算机程序的性能标准.” 一种经常引用的英文定义是:A computer program is said

AngularJS快速入门指南14:数据验证

thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table.reference>thead>tr>td, table.reference>tbody>tr>td, table.reference>tfoot>tr>td { padding: 8px; line-height: 1.42857143; vertic

C# for Unity快速入门(连载14)_C#枚举类型

C# for Unity编程语言快速入门教程(连载14)_C#枚举类型 C#的枚举类型(用 "enum"关键字标识),按照笔者理解本质上是一个隐式继承了System.Enum的整形类.枚举类型的主要作用是:为了更好的识别一个变量的具体含义,且固定变量的使用"范围". 例如:形如如下定义 public enum Week{   Monday,  Tuesday,  Wenesday,  Thursday,  Friday,  Saterday,  Sunday }  

Spark入门实战系列--8.Spark MLlib(下)--机器学习库SparkMLlib实战

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能相似,簇与簇之间的object尽可能相异.聚类算法是机器学习(或者说是数据挖掘更合适)中重要的一部分,除了最为简单的K-Means聚类算法外,比较常见的还有层次法(CURE.CHAMELEON等).网

spark Mllib基本功系列编程入门之 SVM实现分类

话不多说.直接上代码咯.欢迎交流. /** * Created by whuscalaman on 1/7/16. */import org.apache.spark.{SparkConf, SparkContext}import org.apache.spark.mllib.classification.SVMWithSGDimport org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.L

《Spark MLlib机器学习实践》内容简介、目录

http://product.dangdang.com/23829918.html Spark作为新兴的.应用范围最为广泛的大数据处理开源框架引起了广泛的关注,它吸引了大量程序设计和开发人员进行相关内容的学习与开发,其中 MLlib是 Spark框架使用的核心.本书是一本细致介绍 Spark MLlib程序设计的图书,入门简单,示例丰富. 本书分为 12章,从 Spark基础安装和配置开始,依次介绍 MLlib程序设计基础.MLlib的数据对象构建.MLlib中 RDD使用介绍,各种分类.聚类.

机器学习Spark Mllib算法源码及实战详解进阶与提高视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv