MLlib是spark的机器学习库,有常用学习算法和实用工具,包括分类、回归、聚类、协同过滤、降维等。分为两个部分:
spark.mllib 基于RDDs的原有API
spark.ml 提供了基于DataFrame的高水平API用于建立ML pipelines
推荐使用spark.ml(基于DataFrame的API更加多样化,更灵活),不过spark也持续支持spark.mllib。
MLlib——数据类型
局部向量[Local vector]
标记点[Labeled point]
局部矩阵[Local matrix]
分布式矩阵[Distributed matrix]
分块矩阵[BlockMatrix]
行矩阵[RowMatrix]
索引行矩阵[IndexedRowMatrix]
坐标矩阵[CoordinateMatrix]
1、局部向量[Local vector]
支持两种类型的局部向量:密集型和稀疏型。局部向量存储在单机上,索引从0开始,数值为double类型。
import org.apache.spark.mllib.linalg.{Vector,Vectors}
val dv:Vector = Vectors.dense(1.0,0.0,3.0)
dv: org.apache.spark.mllib.linalg.Vector = [1.0,0.0,3.0]
val sv1:Vector = Vectors.sparse(3,Array(0,2),Array(1.0,3.0))
sv1: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])
val sv2:Vector = Vectors.sparse(3,Seq((0,1.0),(2,3.0)))
sv2: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])
ps: scala默认引入scala.collection.immutable.Vector,所以引入org.apache.spark.mllib.linalg.Vector具体使用Mlib的向量
2、标记点[Labeled point]
用于有监督学习方法,也是局部变量,通过double型标签关联每个向量。标记点乐意用于分类和回归。二分类中,标签为0 or 1,在多分类中,类标记也是从0开始,0,1,2…
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
val pos = LabeledPoint(1.0,Vectors.dense(1,0,3))
pos: org.apache.spark.mllib.regression.LabeledPoint = (1.0,[1.0,0.0,3.0])
val neg = LabeledPoint(0.0,Vectors.sparse(3,Array(0,2),Array(1.0,3.0)))
neg: org.apache.spark.mllib.regression.LabeledPoint = (0.0,(3,[0,2],[1.0,3.0]))
实际应用中会使用稀疏训练数据,MLlib支持读取libsvm格式的训练语料数据。libsvm是一种文本格式,每行表示一个标记的稀疏特征向量。
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils import
org.apache.spark.rdd.RDD
val examples:RDD[LabeledPoint] =
MLUtils.loadLibSVMFile(sc,”file:///home/hdfs/data_mllib/sample_libsvm_data.txt”)
3、局部矩阵[Local matrix]
使用整型存储行列索引,double型存储数值,存储在单机上。MLlib支持密集型矩阵,元素按列优先以double数组的方式存储。
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
dm: org.apache.spark.mllib.linalg.Matrix =
1.0 2.0
3.0 4.0
5.0 6.0
val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))
sm: org.apache.spark.mllib.linalg.Matrix =
3 x 2 CSCMatrix
(0,0) 9.0
(2,1) 6.0
(1,1) 8.0
4、分布式矩阵 distributed matrix
分布式矩阵是long型存储行列索引,double型存储数值,分布存储在一个和多个RDDs。选择合适的矩阵格式很重要,转换格式是会需要全局的suffle,代价较大。有三种分布式的矩阵。基础的是
RowMatrix,行矩阵,按行存储,行号无意义,如特征向量集就可以表示为行矩阵,通过RDD来支撑军阵部分行,每行是一个局部向量。
IndexedRowMatrix 跟RowMatrix类似,但是带有行号,从而可以标记行进行join操作。
CoordinateMatrix以COO(用于存储稀疏矩阵,以链表形式存放元组),格式存储的分布式矩阵,底层为RDD。
(1)行矩阵 RowMatrix
按行分布式存储,无行索引,每行由局部向量表示,列数受限于整数范围。
(2)索引行矩阵 IndexedRowMatrix
(3)坐标矩阵 CooridinateMatrix
(4)分块矩阵 BlockMatrix