MLlib支持数据存储在单个机器的本地向量(local vectors)和本地矩阵(local matirces)中,同时也可以存储在由一个或多个RDD支撑实现的分布式矩阵。本地向量和本地矩阵是提供公共服务接口的简单数据模型。底层的线性代数操作通过Breeze库和blas库来实现的。在MLlib中,监督学习的一个训练实例被称之为“标记向量(labeled point)”。
1.本地向量
一个本地向量由从0开始的整型索引数据和对应的Double型值数据组成,它存储在某一个机器中。MLlib支持两种类型的本地向量:密集向量和稀疏向量。一个密集向量通过一个double array来存储向量中每个元素的值,而一个稀疏向量通过两个并列的数组indices和values来分别存储向量的索引值和向量的元素。比如,向量(1.0,0.0,3.0)可以用密集向量[1.0,0.0,3.0]存储,或者用稀疏向量的格式(3,[0,2],[1.0,3.0])来存储,稀疏向量中第一个3表示向量长度。
本地向量的基类是Vector,MLilib提供了两个实现子类DenseVector和SparseVector。官方建议通过Vectors中实现的工厂方法来创建本地向量。本地向量的实例对象的创建如下代码所示。
在这里需要注意的是:Scala语言默认引入的是scala.collection.immutable.Vector,为了使用MLlib的Vector,你必须显示引入org.apache.spark.mllib.linalg.Vector。
2.标记向量
一个标记向量,由一个本地向量(密集向量或稀疏向量)和一个标签(label/response)组成。在MLlib中,监督学习算法会使用标记向量。在标记向量中我们使用一个double类型来存储一个标签,因此我们可以在回归和分类中使用到标记向量。对二元分类来说,一个标签或为0(负向)或为1(正向);对多元分类来说,标签应该是从0开始的索引,如0,1,2,……
含有标签的标记向量通过case class LabeledPoint来表示,标记向量的实例化如以下代码所示。
3.稀疏数据
在实际运用中,稀疏数据是很常见的。MLlib可以读取以LIBSVM格式存储的训练实例,LIBSVM格式是LIBSVM和LIBLINEAR使用的默认格式,这是一种文本格式,文件中每行代表一个含标签的稀疏特征向量。格式如下:
索引是从1开始并且递增。加载完成后,索引被转换为从0开始。
通过MLUtils.loadLibSVMFile读取训练实例并以LIBSVM格式存储,如下面代码:
4.本地矩阵(www.xing528.com)
一个本地矩阵由整型的行列索引号和对应的double型值数据组成,存储在某一个机器中。MLlib支持密集矩阵,密集矩阵的值数据以列优先的方式存储在一个double数组中。比如下面的矩阵:
其存储方式是一个一维数组[1.0,3.0,5.0,2.0,4.0,6.0]和矩阵的行列大小(3,2)。
本地矩阵的基类是Matrix,目前官方提供了一个实现DenseMatrix,建议通过Matrices中实现的工厂方法来创建本地矩阵,本地矩阵的创建如以下代码所示。
5.分布式矩阵
一个分布式矩阵由long型行列索引号和对应的double型值数据组成,它分布式存储在一个或多个RDD中。对于数据量大的分布式的矩阵来说,选择正确的存储格式非常重要。将一个分布式矩阵转换为另一种不同格式需要全局的Shuffle操作,这样做代价很高。目前,官方实现了三类分布式矩阵存储格式,最基本的类型是RowMatrix,一个RowMatrix是一个面向行的分布式矩阵,其行索引是没有具体含义的。比如一个特征向量集合,通过一个RDD来代表所有的行,每一行就是一个本地向量。对于RowMatrix,我们假定其列数量并不大,这样一个本地向量可以恰当地与驱动结点(Driver)交换信息,并且能够在某一结点中存储和操作。IndexedRowMatrix与RowMatrix相似,但有行索引,可以用来识别行和进行join操作。而CoordinateMatrix是一个以坐标格式(coordinate list,COO)进行存储的分布式矩阵,其实体集合(它的值数据)也是一个RDD。
需要注意的是:因为我们需要缓存矩阵数据的大小,所以分布式矩阵的底层RDD必须是确定的(deterministic)。通常来说,使用非确定的RDD(non-deterministic RDDs)会导致错误。
(1)面向行的分布式矩阵(RowMatrix):一个RowMatrix是一个面向行的分布式矩阵,其行索引是没有具体含义的。比如一个特征向量集合,通过一个RDD来代表所有的行,每一行就是一个本地向量。既然每一行由一个本地向量表示,所以其列数就被整型数据大小所限制,其实在实际环境下列数是一个很小的数值。
一个RowMatrix可从一个RDD[Vector]实例创建。然后我们可以计算行列来统计数据信息,以下是创建RowMatrix实例的示例代码:
(2)行索引矩阵(IndexedRowMatrix):IndexedRowMatrix与RowMatrix相似,但其行索引具有特定含义,IndexedRowMatrix本质上是一个含有行索引信息的数据集合(an RDD of indexed rows)。每一行由long型索引和一个本地向量组成。一个IndexedRowMatrix可从一个RDD[IndexedRow]实例创建,这里的IndexedRow是(Long,Vector)的封装类,剔除IndexedRowMatrix中的行索引信息就变成一个RowMatrix。IndexedRowMatrix实例的创建如以下示例代码所示。
(3)坐标矩阵:一个CoordinateMatrix是一个分布式矩阵,其实体集合(数据项)也是用一个RDD存储,每一个实体是一个元组(i:Long,j:Long,value:Double),其中i代表行索引,j代表列索引,value代表实体的值。只有当矩阵的行和列都很大并且矩阵很稀疏时才使用CoordinateMatrix。
一个CoordinateMatri可从一个RDD[MatrixEntry]实例创建,这里的MatrixEntry是(Long,Long,Double)的封装类,通过调用toIndexedRowMatrix()方法可以将一个Coordinate-Matrix转换为一个IndexedRowMatrix(但其行是稀疏的)。目前暂不支持对CoordinateMatri的其他计算操作。CoordinateMatrix实例的创建如以下代码所示。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。