我试图创建一个函数,如下所示 two org.apache.spark.ml.linalg.Vector
. 或者两个稀疏向量
这个向量可以如下所示
(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])
例如。
def add_vectors(x: org.apache.spark.ml.linalg.Vector,y:org.apache.spark.ml.linalg.Vector): org.apache.spark.ml.linalg.Vector = {
}
让我们看一个用例
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))
这是另一个例子,他们共享相同的指数
val x = Vectors.sparse(2, List(1), List(1))
val y = Vectors.sparse(2, List(1), List(1))
此输出应为
Vectors.sparse(2, List(1), List(2))
我意识到做这件事比看起来要难。我研究了一种可能的解决方案,将向量转换为breeze,将它们添加到breeze中,然后将其转换回向量。e、 g两个rdd[mllib.linalg.vector]的加法。所以我试着实现这个。
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
}
然而,这给了我一个错误,在最后一行
val vectout = Vectors.dense((bv1 + bv2).toArray)
无法解析重载方法“dense”。我想知道为什么会发生错误以及如何解决它?
1条答案
按热度按时间44u64gxh1#
为了回答我自己的问题,我不得不考虑向量有多稀疏。例如,稀疏向量需要3个参数。维数,索引数组,最后是值数组。例如。
如果我把这个sparsevector转换成一个数组,我会得到以下结果。
代码:
输出:
这被认为是一个更密集的代表。所以一旦你把两个向量转换成数组,你就可以用下面的代码把它们加起来
这将为您提供另一个数组,它们都已添加。接下来要创建新的稀疏向量,您需要创建索引数组,如构造中所示
然后,让我们过滤掉所有-1索引,这些索引表示该索引为零。
记住从两个向量相加的数组中过滤出无零值。
最后,我们可以生成新的稀疏向量