Spark機器學習中ml和mllib中矩陣、向量
阿新 • • 發佈:2017-11-19
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中矩陣、向量