我正在使用带scala的spark并尝试执行以下操作。
我有两个密集的向量(使用Vectors.dense创建),我需要找到这些的点积。我怎么能做到这一点?
另外,我正在根据以逗号分隔的输入文件创建向量。但是缺少一些值。在创建向量时,是否有一种简单的方法可以将这些值读取为零而不是null?
例如:
输入文件:3,1 ,,, 2
创建了向量:3,1,0,0,2
答案 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)