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)

 

7稀疏矩陣:

  println("--------------------MLSparseMatrix-----------------------------")
  //  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. They must be in strictly increasing order for each column
  //  values - non-zero matrix entries in column major
  //  (0, 2, 1, 0, 1, 2)
  //  (0, 2, 3, 6)=> (2-0,3-2,6-3 )得到每一列非零元素個數
  //  (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)

  val mlSM = new MLSparseMatrix(3, 3, Array[Int](0, 2, 3, 6), Array[Int](0, 2, 1, 0, 1, 2), Array[Double](1.0, 2.0, 3.0, 4.0, 5.0, 6.0))
  println(mlSM.toDense)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM