spark 创建稀疏向量和矩阵

Posted 江枫1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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里面每一对都是(索引,值)的形式。

 

 

 

以上是关于spark 创建稀疏向量和矩阵的主要内容,如果未能解决你的问题,请参考以下文章

spark 类标签的稀疏 特征向量

创建一个密集向量的单位矩阵作为 Spark 数据帧

如何从 Scala 中的 DataFrame 在 Spark 中创建分布式稀疏矩阵

scala 稀疏向量

如何求稀疏矩阵的全部特征值和特征向量?

大数据Spark MLlib机器学习