zoukankan      html  css  js  c++  java
  • spark 密集向量和稀疏向量

    1、概念

    稀疏向量和密集向量都是向量的表示方法
    密集向量和稀疏向量的区别: 密集向量的值就是一个普通的Double数组 而稀疏向量由两个并列的 数组indices和values组成 
    例如:向量(1.0,0.0,1.0,3.0)用密集格式表示为[1.0,0.0,1.0,3.0],
    用稀疏格式表示为(4,[0,2,3],[1.0,1.0,3.0]) 第一个4表示向量的长度(元素个数),[0,2,3]就是indices数组,[1.0,1.0,3.0]是values数组 表示向量0的位置的值是1.0,2的位置的值是1.0,而3的位置的值是3.0,其他的位置都是0

    2、创建

    import org.apache.spark.mllib.linalg.{Vector, Vectors}
    
    // Create a dense vector (1.0, 0.0, 3.0).
    val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
    // Create a sparse vector (1.0, 0.0, 3.0) by specifying its indices and values corresponding to nonzero entries.
    val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
    // Create a sparse vector (1.0, 0.0, 3.0) by specifying its nonzero entries.
    val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))

    3、代码段,通过HashingTF将单词转成稀疏向量,向量值是单词命中的次数。参考地址:https://github.com/asker124143222/spark-demo

        val training: DataFrame = lineRDD.map(line => {
          val strings: Array[String] = line.split(",")
          if (strings.length == 3) {
            (strings(0), strings(1), strings(2).toDouble)
          }
          else {       
            ("-1", strings.mkString(" "), 0.0)
          }
    
        }).filter(s => !s._1.equals("-1"))
          .toDF("id", "text", "label")
    
        //Transformer,转换器,字符解析,转换输入文本,以空格分隔,转成小写词
        val tokenizer: Tokenizer = new Tokenizer()
          .setInputCol("text")
          .setOutputCol("words")
    
    
        //Transformer,转换器,哈希转换,以哈希方式将词转换成词频,转成特征向量
        val hashTF: HashingTF = new HashingTF()
          .setNumFeatures(1000) //缺省是2^18
          .setInputCol(tokenizer.getOutputCol).setOutputCol("features")
    
        //打印hashingTF生成的稀疏向量长什么样
        val wordsData = tokenizer.transform(training)
        val hashData = hashTF.transform(wordsData)
        hashData.collect().foreach(println)
    
        //[0,why hello world JAVA,1.0,WrappedArray(why, hello, world, java),(1000,[48,150,967,973],[1.0,1.0,1.0,1.0])]
        //向量长度1000,即使hash桶的数量,和setNumFeatures的值一致,然后索引是[48,150,967,973],即是hash桶的索引,值都是1.0,即是命中hash桶的次数
  • 相关阅读:
    IT系统
    大型云计算平台的搭建以及解决方案(超详细)(http://c.biancheng.net/view/3961.html)
    E
    Codeforces Round #694 (Div. 1) B. Strange Definition
    Codeforces Round #691 (Div. 2) D. Glass Half Spilled
    Educational Codeforces Round 100 (Rated for Div. 2) 1463D. Pairs
    (指针主席树简单介绍)第k小数
    11月刷题记录
    (补题)牛客国庆集训派对day4
    蓝桥杯前最后的挣扎(雾
  • 原文地址:https://www.cnblogs.com/asker009/p/12157431.html
Copyright © 2011-2022 走看看