zoukankan      html  css  js  c++  java
  • spark 类标签的稀疏 特征向量

    一个向量(1.0,0.0,3.0)它有2中表示的方法

    密集:[1.0,0.0,3.0]    其和一般的数组无异

    稀疏:(3,[0,2],[1.0,3.0])     其表示的含义(向量大小,序号,值)   序号从0开始

    本地向量和矩阵

    本地向量(Local Vector)存储在单台机器上,索引采用0开始的整型表示,值采用Double类型的值表示。Spark MLlib中支持两种类型的矩阵,分别是密度向量(Dense Vector)和稀疏向量(Spasre Vector),密度向量会存储所有的值包括零值,而稀疏向量存储的是索引位置及值,不存储零值,在数据量比较大时,稀疏向量才能体现它的优势和价值。下面给出其应用示例:

    import org.apache.spark.mllib.linalg.{Vector, Vectors}
    
    //密度矩阵,零值也存储
    scala> val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
    dv: org.apache.spark.mllib.linalg.Vector = [1.0,0.0,3.0]
    
    // 创建稀疏矩阵,指定元素的个数、索引及非零值,数组方式
    scala> val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
    sv1: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])
    
    // 创建稀疏矩阵,指定元素的个数、索引及非零值,采用序列方式
    scala> val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))
    sv2: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])

    本地矩阵(Local Matrix)指的也是存储于单台机器上的数据结构,本地矩阵采用整体的行列序号存取元素,本地矩阵也有密度矩阵(Dense Matrix)、稀疏矩阵(Sparse Matrix)两种存储方法,其使用代码如下:

    //密度矩阵的存储
    scala> import org.apache.spark.mllib.linalg.{Matrix, Matrices}
    import org.apache.spark.mllib.linalg.{Matrix, Matrices}
    //创建一个密度矩阵
    scala> val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
    dm: org.apache.spark.mllib.linalg.Matrix = 
    1.0  2.0  
    3.0  4.0  
    5.0  6.0  

    在Spark MLLib中,稀疏矩阵采用的是Compressed Sparse Column (CSC) 格式进行矩阵的存储,具体参见(http://www.tuicool.com/articles/A3emmqi)对稀疏矩阵存储的介绍,例如

    
    //下列矩阵
        1.0 0.0 4.0
    
        0.0 3.0 5.0
    
        2.0 0.0 6.0
    如果采用稀疏矩阵存储的话,其存储信息包括:
    实际存储值: [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]`,
    矩阵元素对应的行索引:rowIndices=[0, 2, 1, 0, 1, 2]`
    列起始位置索引: `colPointers=[0, 2, 3, 6]`.
    
    
    scala> val sparseMatrix= Matrices.sparse(3, 3, Array(0, 2, 3, 6), Array(0, 2, 1, 0, 1, 2), Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0))
    sparseMatrix: org.apache.spark.mllib.linalg.Matrix = 
    3 x 3 CSCMatrix
    (0,0) 1.0
    (2,0) 2.0
    (1,1) 3.0
    (0,2) 4.0
    (1,2) 5.0
    (2,2) 6.0

    2. 带类标签的特征向量(Labeled point)

    Labeled point是Spark MLlib中最重要的数据结构之一,它在无监督学习算法中使用十分广泛,它也是一种本地向量,只不过它提供了类的标签,对于二元分类,它的标签数据为0和1,而对于多类分类,它的标签数据为0,1,2,…。它同本地向量一样,同时具有Sparse和Dense两种实现方式,例如:

    scala> import org.apache.spark.mllib.regression.LabeledPoint
    import org.apache.spark.mllib.regression.LabeledPoint
    
    // LabeledPoint第一个参数是类标签数据,第二参数是对应的特征数据
    //下面给出的是其密度向量实现方式
    scala> val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
    pos: org.apache.spark.mllib.regression.LabeledPoint = (1.0,[1.0,0.0,3.0])
    
     // LabeledPoint的稀疏向量实现方式
    scala> val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
    neg: org.apache.spark.mllib.regression.LabeledPoint = (0.0,(3,[0,2],[1.0,3.0]))

    LabeledPoint的稀疏向量实现方式在实际中应用最为广泛,这是因为某一特征的维度可能达到上千,而这其中又存在大量对后期训练无益的零值特征信息,如果对所有的零值特征都进行存储的话,会浪费大量的存储空间,因此实际中常常使用稀疏的实现方式,使用的是LIBSVM格式:label index1:value1 index2:value2 …进行特征标签及特征的存储与读取。

    scala> val examples: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "/data/sample_data.txt")

    摘自:http://blog.csdn.net/lovehuangjiaju/article/details/48297921
  • 相关阅读:
    find命令进阶(二):对找到的文件执行操作exec
    find命令进阶用法(一)
    find按照文件大小查找
    find命令查找目录
    什么是ppa
    Linux进程管理命令
    [HDOJ4135]Co-prime
    [HDOJ5391]Zball in Tina Town
    [模拟]位运算实现四则运算
    [HDOJ1233]还是畅通工程
  • 原文地址:https://www.cnblogs.com/bonelee/p/7814081.html
Copyright © 2011-2022 走看看