1、关于CSC的介绍,请看这篇博客:SciPy教程 - 稀疏矩阵库scipy.sparse
2、先看一下Matrices.sparse的声明:
def sparse(numRows: Int, numCols: Int, colPtrs: Array[Int], rowIndices: Array[Int], values: Array[Double]): Matrix
Creates a column-major sparse matrix in Compressed Sparse Column (CSC) format.
numRows :number of rows
numCols :number of columns
colPtrs :the index corresponding to the start of a new column
rowIndices :the row index of the entry
values :non-zero matrix entries in column major
3、结合实例解释spark.mllib中CSC的用法:
例子1:
9 0
0 8
0 6
values : 9 8 6
rowindexces : 0 1 2 (entity所在行的索引)
colPtrs : 0 1 3
对colPtrs的解释:
CSC是按列压缩,这个是每列起始元素的索引,而且colPtrs的长度等于原矩阵numCols+1,在这里,colPtrs应该有3个元素,
那最后一个元素就是说:如果还有新列中的元素,它的下标应该从3开始。在这里,第一列(9 0 0)的起始元素的索引为0,第二列(0 8 6)
的起始元素的索引为1(前面有一列,只有一个元素9,占用了一个位置,下次从1开始),将来的新的列的起始索引为3(前面有两列,
共有3个元素,下次从3开始)。
scala> val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 1, 2), Array(9, 8, 6))
sm: org.apache.spark.mllib.linalg.Matrix =
3 x 2 CSCMatrix
(0,0) 9.0
(1,1) 8.0
(2,1) 6.0
scala> val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))
sm: org.apache.spark.mllib.linalg.Matrix =
3 x 2 CSCMatrix
(0,0) 9.0
(2,1) 6.0
(1,1) 8.0
例子2:
9 0
0 8
0 6
0 5
values : 9 8 6 5
rowindexces : 0 1 2 3
colPtrs : 0 1 4
scala> val sm: Matrix = Matrices.sparse(4, 2, Array(0, 1, 4), Array(0, 1, 2, 3), Array(9, 8, 6, 5))
sm: org.apache.spark.mllib.linalg.Matrix =
4 x 2 CSCMatrix
(0,0) 9.0
(1,1) 8.0
(2,1) 6.0
(3,1) 5.0
例子3:
9 0 0 0
0 8 6 5
values : 9 8 6 5
rowindexces : 0 1 1 1
colPtrs : 0 1 2 3 4
scala> val sm: Matrix = Matrices.sparse(2, 4, Array(0, 1, 2, 3, 4), Array(0, 1, 1, 1), Array(9, 8, 6, 5))
sm: org.apache.spark.mllib.linalg.Matrix =
2 x 4 CSCMatrix
(0,0) 9.0
(1,1) 8.0
(1,2) 6.0
(1,3) 5.0