此部分主要关于MLlib的基础数据结构
1、本地向量
MLlib的本地向量主要分为两种,DenseVector和SparseVector,顾名思义,前者是用来保存稠密向量,后者是用来保存稀疏向量,其创建方式主要有一下三种(三种方式均创建了向量(1.0, 0.0, 2.0):
对于稀疏向量,当采用第一种方式时,3表示此向量的长度,第一个Array(0,2)表示的索引,第二个Array(1.0, 3.0)与前面的Array(0,2)是相互对应的,表示第0个位置的值为1.0,第2个位置的值为3
对于稀疏向量,当采用第二种方式时,3表示此向量的长度,后面的比较直观,Seq里面每一对都是(索引,值)的形式。
tips:由于scala中会默认包含scal.collection.immutalbe.Vector,所以当使用MLlib中的Vector时,需要显式的指明import路径
2、向量标签
向量标签和向量是一起的,简单来说,可以理解为一个向量对应的一个特殊值,这个值的具体内容可以由用户指定,比如你开发了一个算法A,这个算法对每个向量处理之后会得出一个特殊的标记值p,你就可以把p作为向量标签。同样的,更为直观的话,你可以把向量标签作为行索引,从而用多个本地向量构成一个矩阵(当然,MLlib中已经实现了多种矩阵)
其使用代码为:
从文件中直接读入一个LabeledPoint
MLlib提供了一种快捷的方法,可以让用户直接从文件中读取LabeledPoint格式的数据。规定其输入文件的格式为:
1 2 val test : RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "path")
3、本地矩阵
既然是算数运算包,肯定少不了矩阵包,先上代码:
1 import org.apache.spark.mllib.linalg.{Matrix, Matrices} 2 3 val dm : Matrix = Matrices.dense(3,2, Array(1.0,3.0,5.0,2.0,4.0,6.0))
上面的代码段创建了一个稠密矩阵:
1.0 | 2.0 |
3.0 | 4.0 |
5.0 | 6.0 |
tips:注意,我们创建的是稠密矩阵,不幸的事,MLlib中并没有提供稀疏矩阵的实现,官方说在后续版本中会提供。
4、分布式矩阵
MLlib提供了三种分布式矩阵的实现,依据你数据的不同的特点,你可以选择不同类型的数据:
a、RowMatrix
RowMatrix矩阵只是将矩阵存储起来,要注意的是,此种矩阵不能按照行号访问。
import org.apache.spark.mllib.linalg.Vector import org.apache.spark.mllib.linalg.distributed.RowMatrix val rows: RDD[Vector] = ...// val mat: RowMatrix = new RowMatrix(rows) val m = mat.numRows() val n = mat.numCols()
RowMatrix要从RDD[Vector]构造,m是mat的行数,n是mat的列
Multivariate summary statistics
顾名思义,这个类里面包含了矩阵中的很多常见信息,怎么使用呢?
1 import org.apache.spark.mllib.linalg.Matrix 2 import org.apache.spark.mllib.linalg.distributed.RowMatrix 3 import org.apache.spark.mllib.stat.MultivariateStatisticalSummary 4 5 val mat: RowMatrix = .. 6 7 val summy : MultivariateStatisticalSummary = mat.computeColumnSummaryStatistics() 8 println(summy.mean)//平均数
通过这个类,可以得到平均数,矩阵中非0个数,具体的数据看看帮助文档
b、IndexedRowMatrix
IndexedRowMatrix矩阵和RowMatrix矩阵的不同之处在于,你可以通过索引值来访问每一行。其他的,没啥区别。。
c、CoordinateMatrix
当你的数据特别稀疏的时候怎么办?采用这种矩阵吧。先上代码:
1 import org.apache.spark.mllib.linalg.distributed.{CoordinatedMatrix, MatrixEntry} 2 3 val entries : RDD[MatrixEntry] = .. 4 val mat: CoordinateMatrix = new CoordinateMatrix(entries)
CoordinateMatrix矩阵中的存储形式是(row,col,value),就是原始的最稀疏的方式,所以如果矩阵比较稠密,别用这种数据格式