spark 類標簽的稀疏 特征向量


一個向量(1.0,0.0,3.0)它有2中表示的方法

密集:[1.0,0.0,3.0]    其和一般的數組無異

稀疏:(3,[0,2],[1.0,3.0])     其表示的含義(向量大小,序號,值)   序號從0開始

本地向量和矩陣

本地向量(Local Vector)存儲在單台機器上,索引采用0開始的整型表示,值采用Double類型的值表示。Spark MLlib中支持兩種類型的矩陣,分別是密度向量(Dense Vector)和稀疏向量(Spasre Vector),密度向量會存儲所有的值包括零值,而稀疏向量存儲的是索引位置及值,不存儲零值,在數據量比較大時,稀疏向量才能體現它的優勢和價值。下面給出其應用示例:

import org.apache.spark.mllib.linalg.{Vector, Vectors} //密度矩陣,零值也存儲 scala> val dv: Vector = Vectors.dense(1.0, 0.0, 3.0) dv: org.apache.spark.mllib.linalg.Vector = [1.0,0.0,3.0] // 創建稀疏矩陣,指定元素的個數、索引及非零值,數組方式 scala> val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)) sv1: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0]) // 創建稀疏矩陣,指定元素的個數、索引及非零值,采用序列方式 scala> val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0))) sv2: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])

本地矩陣(Local Matrix)指的也是存儲於單台機器上的數據結構,本地矩陣采用整體的行列序號存取元素,本地矩陣也有密度矩陣(Dense Matrix)、稀疏矩陣(Sparse Matrix)兩種存儲方法,其使用代碼如下:

//密度矩陣的存儲
scala> import org.apache.spark.mllib.linalg.{Matrix, Matrices} import org.apache.spark.mllib.linalg.{Matrix, Matrices} //創建一個密度矩陣 scala> val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0)) dm: org.apache.spark.mllib.linalg.Matrix = 1.0 2.0 3.0 4.0 5.0 6.0 

在Spark MLLib中,稀疏矩陣采用的是Compressed Sparse Column (CSC) 格式進行矩陣的存儲,具體參見(http://www.tuicool.com/articles/A3emmqi)對稀疏矩陣存儲的介紹,例如


//下列矩陣
    1.0 0.0 4.0 0.0 3.0 5.0 2.0 0.0 6.0 如果采用稀疏矩陣存儲的話,其存儲信息包括: 實際存儲值: [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]`, 矩陣元素對應的行索引:rowIndices=[0, 2, 1, 0, 1, 2]` 列起始位置索引: `colPointers=[0, 2, 3, 6]`. scala> val sparseMatrix= Matrices.sparse(3, 3, Array(0, 2, 3, 6), Array(0, 2, 1, 0, 1, 2), Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0)) sparseMatrix: org.apache.spark.mllib.linalg.Matrix = 3 x 3 CSCMatrix (0,0) 1.0 (2,0) 2.0 (1,1) 3.0 (0,2) 4.0 (1,2) 5.0 (2,2) 6.0

2. 帶類標簽的特征向量(Labeled point)

Labeled point是Spark MLlib中最重要的數據結構之一,它在無監督學習算法中使用十分廣泛,它也是一種本地向量,只不過它提供了類的標簽,對於二元分類,它的標簽數據為0和1,而對於多類分類,它的標簽數據為0,1,2,…。它同本地向量一樣,同時具有Sparse和Dense兩種實現方式,例如:

scala> import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.regression.LabeledPoint // LabeledPoint第一個參數是類標簽數據,第二參數是對應的特征數據 //下面給出的是其密度向量實現方式 scala> val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0)) pos: org.apache.spark.mllib.regression.LabeledPoint = (1.0,[1.0,0.0,3.0]) // LabeledPoint的稀疏向量實現方式 scala> val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))) neg: org.apache.spark.mllib.regression.LabeledPoint = (0.0,(3,[0,2],[1.0,3.0]))

LabeledPoint的稀疏向量實現方式在實際中應用最為廣泛,這是因為某一特征的維度可能達到上千,而這其中又存在大量對后期訓練無益的零值特征信息,如果對所有的零值特征都進行存儲的話,會浪費大量的存儲空間,因此實際中常常使用稀疏的實現方式,使用的是LIBSVM格式:label index1:value1 index2:value2 …進行特征標簽及特征的存儲與讀取。

scala> val examples: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "/data/sample_data.txt")

摘自:http://blog.csdn.net/lovehuangjiaju/article/details/48297921


免責聲明!

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



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