首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加稀疏向量3.0.0

添加稀疏向量3.0.0
EN

Stack Overflow用户
提问于 2020-08-07 20:03:17
回答 1查看 484关注 0票数 0

我试图创建一个函数,如下所示,以添加two org.apache.spark.ml.linalg.Vector。即两个稀疏向量

该向量可以如下所示

代码语言:javascript
复制
(28,[1,2,3,4,7,11,12,13,14,15,17,20,22,23,24,25],[0.13028398104008743,0.23648605632753023,0.7094581689825907,0.13028398104008743,0.23648605632753023,0.0,0.14218861229025295,0.3580566057240087,0.14218861229025295,0.13028398104008743,0.26056796208017485,0.0,0.14218861229025295,0.06514199052004371,0.13028398104008743,0.23648605632753023])

例如:

代码语言:javascript
复制
def add_vectors(x: org.apache.spark.ml.linalg.Vector,y:org.apache.spark.ml.linalg.Vector): org.apache.spark.ml.linalg.Vector = {
      
    }

让我们看看用例

代码语言:javascript
复制
val x = Vectors.sparse(2, List(0), List(1)) // [1, 0]
val y = Vectors.sparse(2, List(1), List(1)) // [0, 1]

I want to output to be 

Vectors.sparse(2, List(0,1), List(1,1)) 

这是另一个例子,他们共享相同的指数

代码语言:javascript
复制
val x = Vectors.sparse(2, List(1), List(1))
val y = Vectors.sparse(2, List(1), List(1)) 

这个输出应该是

代码语言:javascript
复制
Vectors.sparse(2, List(1), List(2)) 

我意识到做这件事比看上去更难。我研究了一个可能的解决方案,将向量转换为微风,然后将它们添加到微风中,然后再将它们转换回矢量。例如Addition of two RDD[mllib.linalg.Vector]'s。所以我试着实现这个。

代码语言:javascript
复制
def add_vectors(x: org.apache.spark.ml.linalg.Vector,y:org.apache.spark.ml.linalg.Vector) ={

   val dense_x = x.toDense
   val dense_y = y.toDense

  val bv1 = new DenseVector(dense_x.toArray)
  val bv2 = new DenseVector(dense_y.toArray)

  val vectout = Vectors.dense((bv1 + bv2).toArray)
  vectout
}

然而,这在最后一行中给了我一个错误。

代码语言:javascript
复制
val vectout = Vectors.dense((bv1 + bv2).toArray)

无法解析重载的方法“稠密”。我想知道为什么会出现错误以及修复错误的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-08 01:19:49

为了回答我自己的问题,我不得不考虑向量有多稀疏。例如,稀疏向量需要3个参数。维数、索引数组,最后是值数组。例如:

代码语言:javascript
复制
val indices: Array[Int] = Array(1,2)
      val norms: Array[Double] = Array(0.5,0.3)
      val num_int = 4
      val vector: Vector = Vectors.sparse(num_int, indices, norms)

如果我将这个SparseVector转换为一个数组,我将得到以下内容。

代码:

代码语言:javascript
复制
 val choiced_array = vector.toArray

 choiced_array.map(element => print(element + " "))

输出:

代码语言:javascript
复制
   [0.0, 0.5,0.3,0.0].

这被认为是它的一个更密集的表示。因此,一旦将这两个向量转换为数组,就可以使用以下代码添加它们

代码语言:javascript
复制
val add: Array[Double] = (vector.toArray, vector_2.toArray).zipped.map(_ + _)

这给您提供了另一个数组,它们都是添加的。接下来要创建新的稀疏向量,您需要创建一个索引数组,如构造中所示

代码语言:javascript
复制
 var i = -1;
  val new_indices_pre = add.map( (element:Double) => {
    i = i + 1
    if(element > 0.0)
      i
    else{
      -1
    }
  })

然后,让我们过滤掉所有-1指数的指示,为该标志为零。

代码语言:javascript
复制
new_indices_pre.filter(element => element != -1)

记住,从包含两个向量的数组中筛选出零值。

代码语言:javascript
复制
val final_add = add.filter(element => element > 0.0)

最后,我们可以构造新的稀疏向量。

代码语言:javascript
复制
Vectors.sparse(num_int,new_indices,final_add)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63308505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档