局部矩阵
局部矩阵具有整数类型的行和列索引和double类型的值,存储在单个节点上。MLlib支持密集矩阵,其入口值以列主序列存储在单个double元祖里,稀疏矩阵的非零入口值以列主要顺序存储在压缩稀疏列(CSC)格式中。例如,以下密集矩阵 存储在一维数组中。[1.0, 3.0, 5.0, 2.0, 4.0, 6.0] 矩阵的大小为(3, 2)
⎛1.0 3.0⎞
⎜5.0 2.0⎟
⎝4.0 6.0⎠
Scala
基类局部矩阵是 Matrix,我们提供两种实现:DenseMatrix,和SparseMatrix。我们建议使用实现的工厂方法Matrices来创建本地矩阵。记住,MLlib中的局部矩阵以列主要顺序存储。
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
// Create a dense matrix ((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))
val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
// Create a sparse matrix ((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))
sparse matrix csc 构造方法
(9.0, 0.0)
(0.0, 8.0)
(0.0, 6.0)
构造 数组 csc
Array(0, 1, 3) Array(0, 2, 1) Array(9, 6, 8)
第一个Array:
第一个array的长度为矩阵的 列数(column)+1并且第一位永远为 0 第n列为 matrix的前(n-1)列 不为0 的元素数,如上matrix的第一列 有1个不为零的数,前两列有3个部位0的数组 那么array1 为 Array(0,1,3)第二个Array:
第二个array 为 每列中不为0的元素的行号,那么他的位数应该是 第一个Array的最后一个元素大小,计算如上第二个Array为Array(0,1,2)第三个Array:
第三个array 为 每列中不为0的元素的值,那么他的位数应该是 第一个Array的最后一个元素大小,一次计算如上第二个Array为Array(9,8,6)