带有空值的密集向量的点积

时间:2017-06-17 20:47:55

标签: scala apache-spark

我正在使用带scala的spark并尝试执行以下操作。

我有两个密集的向量(使用Vectors.dense创建),我需要找到这些的点积。我怎么能做到这一点?

另外,我正在根据以逗号分隔的输入文件创建向量。但是缺少一些值。在创建向量时,是否有一种简单的方法可以将这些值读取为零而不是null?

例如:

输入文件:3,1 ,,, 2

创建了向量:3,1,0,0,2

1 个答案:

答案 0 :(得分:1)

Spark向量只是数组的包装器,在内部它们被转换为Breeze数组以进行向量/矩阵运算。您可以手动执行此操作以获取点积:

import org.apache.spark.mllib.linalg.{Vector, Vectors, DenseVector}
import breeze.linalg.{DenseVector => BDV, SparseVector => BSV, Vector => BV}

val dv1: Vector = Vectors.dense(1.0, 0.0, 3.0)
val bdv1 = new BDV(dv1.toArray)

val dv2: Vector = Vectors.dense(2.0, 0.0, 0.0)
val bdv2 = new BDV(dv2.toArray)

scala> bdv1 dot bdv2
res3: Double = 2.0

对于第二个问题,你可以这样做:

val v: String = "3,1,,,2"

scala> v.split("\\,").map(r => if (r == "") 0 else r.toInt)
res4: Array[Int] = Array(3, 1, 0, 0, 2)