1. 程式人生 > >Spark機器學習中ml和mllib中矩陣、向量

Spark機器學習中ml和mllib中矩陣、向量

int reg index mac matrix 對比 判斷 bsp ive

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中矩陣、向量