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里面每一对都是(索引,值)的形式。