今天开始记录spark中机器学习的相关应用。
spark某种意义上讲就是为机器学习准备的,其一,spark是一种内存计算框架,速度快,其二,spark更擅长处理迭代式的数据计算,而迭代运算这是机器学习模型经常遇到的。延申一点,目前大数据还有一种是流式运算,也就是处理的是实时数据,虽然这种spark也可以,但是毕竟是一种伪造的流式。
所以更多时候spark是处理离线的、迭代式的运算。spark里面目前已经集成了专门的机器学习框架mllib,目前为止已经非常丰富成熟了,实乃大数据机器学习领域的必须框架。
机器学习任务第一步要做的一般都是数据准备,包括数据类型以及数据格式,通常情况下特征是以向量或者矩阵的形式进行训练的,spark的基础数据格式是RDD,那么结合机器学习的数据格式是什么样的呢?
- mllib的基本数据类型
机器学习的特征数据无非两种:向量类型的,矩阵类型的。mllib也是如此,再将数据分为本地的和分布式的,就是四种基本数据类型:
(1)本地的向量
(2)本地的矩阵
(3)分布式的向量(是一种向量标签)
(4)分布式的矩阵
- 本地的向量
向量应该说是spark机器学习里面最重要的一种结构,在spark里面,有专门根据数组生成可以用的向量的方法,只需要调用一下对应的包即可:
import org.apache.spark.mllib.linalg.{Vector, Vectors}
注意机器学习的所有的数据结构相关的都在org.apache.spark.mllib.linalg这个包里面可以找到。
举个例子假设我们想将array数组变成机器学习的向量,可以如下:
scala> var arr=Array(1.0, 2.0, 3.0, 4.0)
arr: Array[Double] = Array(1.0, 2.0, 3.0, 4.0)
scala> import org.apache.spark.mllib.linalg.{Vector, Vectors}
scala> var vec=Vectors.dense(arr)
vec: org.apache.spark.mllib.linalg.Vector = [1.0,2.0,3.0,4.0]
说起向量,我们自然会想到有两种向量存在:稠密向量