spark 創建稀疏向量和矩陣


 http://blog.csdn.net/canglingye/article/details/41316193

 

【相互轉換】:http://stackoverflow.com/questions/32456808/sparsevector-to-densevector-conversion-in-pyspark

 

1、稀疏矩陣和稠密矩陣可以轉換成數組

2、數組可以轉換成稠密矩陣

3、稀疏矩陣不能直接轉換為稠密矩陣,需要先轉換為數組;但是,數組和稠密矩陣都不能直接轉換為稀疏矩陣

 from pyspark.mllib.linalg import SparseVector, DenseVector

s1=SparseVector(5,{4:1.})  

 >>> s1

SparseVector(5, {4: 1.0})

 

>>> a1=s1.toArray()
>>> a1
array([ 0., 0., 0., 0., 1.])

 

d1=DenseVector(a1)

>>> d1
DenseVector([0.0, 0.0, 0.0, 0.0, 1.0])

 

a2=d1.toArray()
>>> a2
array([ 0., 0., 0., 0., 1.])

 

 通過函數將rdd轉成稀疏矩陣

####轉稀疏矩陣
  def sparse(p):
         vec=[int(x) for x in p[2:]]
         lvec=len(vec)
         dic1={}
         for i in range(lvec):
            if vec[i]==1:
               dic1[i]=1
     return [p[0],p[1],SparseVector(lvec,dic1)]


     lt11=lt8.map(sparse)

 

>>> lt11.take(2)

[ [u'ANDROID-5a9ac5c22ad94e26b2fa24e296787a35', u'0', SparseVector(10000, {3: 1.0, 13: 1.0, 64: 1.0, 441: 1.0, 801: 1.0})],

[u'ANDROID-188949641b6c4f1f8c1c79b5c7760c2f', u'0', SparseVector(10000, {2: 1.0, 3: 1.0, 4: 1.0, 13: 1.0, 27: 1.0, 39: 1.0, 41: 1.0, 150: 1.0, 736: 1.0, 9675: 1.0})] ]

 

 

 

 

1、本地向量

MLlib的本地向量主要分為兩種,DenseVector和SparseVector,顧名思義,前者是用來保存稠密向量,后者是用來保存稀疏向量,
其創建方式主要有一下三種(三種方式均創建了向量(1.0, 0.0, 3.0):
 
  1. import org.apache.spark.mllib.linalg.{Vector, Vectors}  
  2. //創建一個稠密向量  
  3. val dv : Vector = Vector.dense(1.0,0.0,3.0);  
  4. //創建一個稀疏向量(第一種方式)  
  5. val sv1: Vector = Vector.sparse(3, Array(0,2), Array(1.0,3.0));  
  6. //創建一個稀疏向量(第二種方式)  
  7. val sv2 : Vector = Vector.sparse(3, Seq((0,1.0),(2,3.0))

對於稠密向量:很直觀,你要創建什么,就加入什么,其函數聲明為Vector.dense(values : Array[Double])

對於稀疏向量,當采用第一種方式時,3表示此向量的長度第一個Array(0,2)表示的索引,第二個Array(1.0, 3.0)與前面的Array(0,2)是相互對應的,表示第0個位置的值為1.0,第2個位置的值為3

對於稀疏向量, 當采用第二種方式時,3表示此向量的長度,后面的比較直觀, Seq里面每一對都是(索引,值)的形式。

 

 

 


免責聲明!

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



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