本地矩阵(Local Matrix)
本地矩阵具有整型的行、列索引值和双精度浮点型的元素值,它存储在单机上。MLlib支持稠密矩阵DenseMatrix
和稀疏矩阵Sparse Matrix
两种本地矩阵,稠密矩阵将所有元素的值存储在一个列优先(Column-major)的双精度型数组中,而稀疏矩阵则将非零元素以列优先的CSC(Compressed Sparse Column)模式进行存储,关于CSC等稀疏矩阵存储方式的具体实现,可以参看:
https://www.tuicool.com/articles/A3emmqi
或者
http://www.cs.colostate.edu/~mcrob/toolbox/c++/sparseMatrix/sparse_matrix_compression.html
本地矩阵的基类是org.apache.spark.mllib.linalg.Matrix
,DenseMatrix
和SparseMatrix
均是它的实现类,和本地向量类似,MLlib也为本地矩阵提供了相应的工具类Matrices
,调用工厂方法即可创建实例:
1 scala>import org.apache.spark.mllib.linalg.{Matrix, Matrices} 2 import org.apache.spark.mllib.linalg.{Matrix, Matrices} 3 // 创建一个3行2列的稠密矩阵[ [1.0,2.0], [3.0,4.0], [5.0,6.0] ] 4 // 请注意,这里的数组参数是列先序的! 5 scala> val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0)) 6 dm: org.apache.spark.mllib.linalg.Matrix = 7 1.0 2.0 8 3.0 4.0 9 5.0 6.0 10
这里可以看出列优先的排列方式,即按照列的方式从数组中提取元素。也可以创建稀疏矩阵:
1 // 创建一个3行2列的稀疏矩阵[ [9.0,0.0], [0.0,8.0], [0.0,6.0]] 2 // 第一个数组参数表示列指针,即每一列元素的开始索引值 3 // 第二个数组参数表示行索引,即对应的元素是属于哪一行 4 // 第三个数组即是按列先序排列的所有非零元素,通过列指针和行索引即可判断每个元素所在的位置 5 scala> val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8)) 6 sm: org.apache.spark.mllib.linalg.Matrix = 7 3 x 2 CSCMatrix 8 (0,0) 9.0 9 (2,1) 6.0 10 (1,1) 8.0
9 0
0 8
0 6
0 1 3
这里,创建一个3行2列的稀疏矩阵[ [9.0,0.0], [0.0,8.0], [0.0,6.0]]。Matrices.sparse的参数中,3表示行数,2表示列数。第1个数组参数表示列指针,即每一列元素的开始索引值, 第二个数组参数表示行索引,即对应的元素是属于哪一行;第三个数组即是按列先序排列的所有非零元素,通过列指针和行索引即可判断每个元素所在的位置。比如取每个数组的第2个元素为2,1,6,表示第2列第1行的元素值是6.0。
注:第一个数组参数表示列指针详细解释:
列偏移表示某一列的第一个非0元素在values里面的起始偏移位置。在列偏移的最后补上矩阵总的非0元素个数。
0 1 3 6 9 11 14
1 2 4 7 10 12 15
1 //下列矩阵 2 3 1.0 0.0 4.0 4 5 0.0 3.0 5.0 6 7 2.0 0.0 6.0 8 9 如果采用稀疏矩阵存储的话,其存储信息包括: 实际存储值: [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]`, 10 11 矩阵元素对应的行索引:rowIndices=[0, 2, 1, 0, 1, 2]` 12 13 列起始位置索引: `colPointers=[0, 2, 3, 6]`. 14 15 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)) 16 17 sparseMatrix: org.apache.spark.mllib.linalg.Matrix = 3 x 3 CSCMatrix 18 19 (0,0) 1.0 20 21 (2,0) 2.0 22 23 (1,1) 3.0 24 25 (0,2) 4.0 26 27 (1,2) 5.0 28 29 (2,2) 6.0