Spark Mllib里的本地向量集(密集型数据集和稀疏型数据集概念、构成)(图文详解)

  不多说,直接上干货!

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

  

  更多具体,见

Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mllib数理统计

原文地址:https://www.cnblogs.com/zlslch/p/7469342.html