不多说,直接上干货!
Local vector : 本地向量集
由两类构成:稀疏型数据集(spares)和密集型数据集(dense)
(1)、密集型数据集
例如一个向量数据(9,5,2,7),可以设定为(9,5,2,7)进行存储,数据集被作为一个集合的形式整体存储。
(2)、稀疏型数据集
例如一个向量数据(9,5,2,7),可以按向量的大小存储为(4,Array(0,1,2,3),Array(9,5,2,7))
testVector.scala
package zhouls.bigdata.chapter4 import org.apache.spark.mllib.linalg.{Vector, Vectors} object testVector { /* * 主函数 */ def main(args: Array[String]) { val vd: Vector = Vectors.dense(2, 0, 6) //建立密集向量 println(vd(2)) //打印密集向量第3个值 val vs: Vector = Vectors.sparse(4, Array(0,1,2,3), Array(9,5,2,7))//建立稀疏向量 println(vs(2)) //打印稀疏向量第3个值 } }
有人会问,为什么会输出来为浮点型数了呢。
答:对于目前,Spark Mllib,仅支持整数与浮点型数。这是因为与其目的数值计算有关。
dense方法,不多赘述。
sparse方法,第一个参数4是代表输入数据的大小,一般要求大于等于输入的数据值。
第二个参数Array(0,1,2,3)是数据vs下标的数值
第三个参数Array(9,5,2,7)是输入的数据值,一般要求将其作为一个Array类型的数据进行输入
总结
Spark MLlib的本地向量主要分为两种,DenseVector和SparseVector,顾名思义,前者是用来保存稠密向量,后者是用来保存稀疏向量,其创建方式主要有一下三种(三种方式均创建了向量(1.0, 0.0, 2.0):
import org.apache.spark.mllib.linalg.{Vector, Vectors} //创建一个稠密向量 val dv : Vector = Vector.dense(1.0,0.0,3.0); //创建一个稀疏向量(第一种方式) val sv1: Vector = Vector.sparse(3, Array(0,2), Array(1.0,3.0)); //创建一个稀疏向量(第二种方式) 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里面每一对都是(索引,值)的形式。
更多具体,见