Spark mlib的本地向量
Spark mlib的本地向量有两种:
DenseVctor :稠密向量 其创建方式 Vector.dense(数据)
SparseVector :稀疏向量 其创建方式有两种:
方法一:Vector.sparse(向量长度,索引数组,与索引数组所对应的数值数组)
方法二:Vector.sparse(向量长度,(索引,数值),(索引,数值),(索引,数值),...(索引,数值))
示例:
比如向量(1,0,3,4)的创建有三种方法:
稠密向量:直接Vectors.dense(1,0,3,4)
稀疏向量:
方法一:Vector.sparse(4,(0,2,3),(1,3,4))
(0,2,3) 表示该向量的第0个,第2个,第3个位置,(1,3,4) 表示(0,2,3)位置对应的数值分别为1,3,4
方法二:Vector.sparse(4,(0,1),(2,3),(3,4))
(0,1)就是(索引,数值)的形式。位置0的数值为1, 位置2的数值为3,位置3的数值为4。
所有本地向量都以org.apache.spark.mllib.linalg.Vector
为基类,DenseVector
和SparseVector
分别是它的两个实现类,故推荐使用Vectors
工具类下定义的工厂方法来创建本地向 量,请看如下实例(假设在Spark-shell中运行,下同):
-
1 scala>import org.apache.spark.mllib.linalg.{Vector, Vectors} 2 import org.apache.spark.mllib.linalg.{Vector, Vectors} 3 4 // 创建一个稠密本地向量 5 scala> val dv: Vector = Vectors.dense(2.0, 0.0, 8.0) 6 dv: org.apache.spark.mllib.linalg.Vector = [2.0,0.0,8.0] 7 // 创建一个稀疏本地向量 8 // 方法第二个参数数组指定了非零元素的索引,而第三个参数数组则给定了非零元素值 9 scala> val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(2.0, 8.0)) 10 sv1: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[2.0,8.0]) 11 // 另一种创建稀疏本地向量的方法 12 // 方法的第二个参数是一个序列,其中每个元素都是一个非零值的元组:(index,elem) 13 scala> val sv2: Vector = Vectors.sparse(3, Seq((0, 2.0), (2, 8.0))) 14 sv2: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[2.0,8.0])
这里需要注意的是,Scala会默认引入scala.collection.immutable.Vector
,我们要显式地引入org.apache.spark.mllib.linalg.Vector
来使用MLlib提供的向量类型。