本地矩阵(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.MatrixDenseMatrixSparseMatrix均是它的实现类,和本地向量类似,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

 

posted @ 2018-07-10 14:04 翻云覆雨任我行 阅读(...) 评论(...) 编辑 收藏