Spark机器学习中ml和mllib中矩阵向量

Posted 进无止境

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark机器学习中ml和mllib中矩阵向量相关的知识,希望对你有一定的参考价值。

1:Spark ML与Spark MLLIB区别?

Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向DataFrame编程的。

 

2:Spark ML与Spark MLLIB中矩阵、向量定义区别?

这两个类库中的矩阵与向量对比可以发现几乎都是一样的,就是为了以后维护Spark ML方便。

 

3:Spark ML中稀疏向量与稠密向量区别?

稠密向量存储:底层存储使用完成的Double Array存储。

稀疏矩阵:底层存储非0的元素值以及该值的index以及向量的size。(也就是三维信息,存储效率高)

 

4:稠密向量示例:

 import org.apache.spark.ml.linalg.{DenseVector => MLDenseVector}
  val mlDv = new MLDenseVector(Array[Double](1, 1, 1, 1, 1))

  println(mlDv.argmax)

  //压缩矩阵,底层根据0的个数进行判断是稀疏存储还是稠密存储。稀疏存储就是存储非0的元素值以及索引以及向量的大小(也就是三维)
  println(mlDv.compressed)
  val copy = mlDv.copy //深拷贝

  copy.foreachActive {
    (x, y) =>
      println("index = " + x + " ,  value = " + y)
  }

  //Number of active entries. An "active entry" is an element which is explicitly(明确地) stored,
  // regardless of its value. Note that inactive entries have value 0.
  println(copy.numActives)
  println(copy.numNonzeros)
  println(copy.size)
  println(copy.values)
  println(copy.toSparse)

5:稀疏矩阵

 import org.apache.spark.ml.linalg.{SparseVector => MLSparseVector}
  val mlDv = new MLDenseVector(Array[Double](1, 0, 0, 0, 0))
  println(mlDv.toSparse)  //(5,[0],[1.0])
  //SparseVector构造器:向量维度,非零索引,非零索引对应的值
  val mlSv = new MLSparseVector(5, Array[Int](0, 3), Array[Double](1, 2))
  println(mlSv) //(5,[0,3],[1.0,2.0])
  println(mlSv.toDense) //[1.0,0.0,0.0,2.0,0.0]
  println(mlSv.indices.toBuffer)//返回稀疏向量的索引

对于mllib下的向量可以使用asML直接转成ML中的向量

  //稀疏矩阵
  import org.apache.spark.mllib.linalg.{DenseVector => MLLIBDenseVector}
  val mlDv = new MLLIBDenseVector(Array[Double](1, 0, 0, 0, 0))
  mlDv.asML //直接转成spark ml的向量

 

6:ML中矩阵

import org.apache.spark.ml.linalg.{DenseMatrix => MLDenseMatrix}
  import org.apache.spark.ml.linalg.{SparseMatrix => MLSparseMatrix}

  // 默认以列为主的稠密矩阵。
  val notTranspose = new MLDenseMatrix(3, 2, Array[Double](1, 3, 5, 2, 4, 6))
  // 第三个参数为是否允许转至,默认不允许,如果允许则按行存储
  val mlDMtx = new MLDenseMatrix(3, 2, Array[Double](1, 2, 3, 4, 5, 6), true)

  println(notTranspose)

  println("-------------------------------------------------")
  println(notTranspose.isTransposed)
  println(notTranspose.transpose)
  println(mlDMtx.isTransposed)
  println("-------------------------------------------------")
  println(mlDMtx)
  println(mlDMtx.compressed)
  println("-------------------------------------------------")
  //转为按照列存储的稠密矩阵
  println(mlDMtx.toDenseColMajor)

  //转为按照行存储的稠密矩阵
  println(notTranspose.toDenseRowMajor)

 

以上是关于Spark机器学习中ml和mllib中矩阵向量的主要内容,如果未能解决你的问题,请参考以下文章

spark-mllib 密集向量和稀疏向量

机器学习 spark.mllib 数据类型学习

spark机器学一Mllib 数据类型

Spark MLlib 机器学习

Spark MLlib 机器学习

掌握Spark机器学习库-02-mllib数据格式