我有函数flagVectorOutlier
,如下面的代码所示。我使用 Breeze 的 DenseVector
和 DenseMatrix
对象来计算 distance
的值。我希望按照函数签名上的编码,获得 Spark RDD[(Double, Boolean)]
。 mi
和 invCovMatrix
分别是 Breeze 的 DenseVector[Double]
和 DenseMatrix[Double]
:
def flagVectorOutlier(testVectors: RDD[(String, SparkVector)], distanceThreshold: Double): RDD[(Double, Boolean)] = {
val testVectorsDenseRDD = testVectors.map { vector => DenseVector(vector._2.toArray)}
val mahalanobisDistancesRDD = testVectorsDenseRDD.map { vector =>
val distance = DenseVector[Double](DenseVector(Transpose(vector - mi) * invCovMatrix) * DenseVector(vector - mi)).toArray
(distance(0), if(distance(0) >= distanceThreshold) true else false)
}
mahalanobisDistancesRDD
}
编译器最终向我显示以下 2 个错误:
Error:(75, 93) could not find implicit value for parameter op: breeze.linalg.operators.OpMulMatrix.Impl2[breeze.linalg.DenseVector[breeze.linalg.Transpose[breeze.linalg.DenseVector[Double]]],breeze.linalg.DenseVector[breeze.linalg.DenseVector[Double]],That]
val distance = DenseVector[Double](DenseVector(Transpose(vector - mi) * invCovMatrix) * DenseVector(vector - mi)).toArray
^
和
Error:(75, 93) not enough arguments for method *: (implicit op: breeze.linalg.operators.OpMulMatrix.Impl2[breeze.linalg.DenseVector[breeze.linalg.Transpose[breeze.linalg.DenseVector[Double]]],breeze.linalg.DenseVector[breeze.linalg.DenseVector[Double]],That])That.
Unspecified value parameter op.
val distance = DenseVector[Double](DenseVector(Transpose(vector - mi) * invCovMatrix) * DenseVector(vector - mi)).toArray
^
我错过了什么?我正在考虑以这种方式在 Breeze 的 DenseVector
之间进行乘法是可能的。
最佳答案
如果您仔细查看错误消息,它会告诉您出了什么问题。
(implicit op: OpMulMatrix.Impl2[
DenseVector[Transpose[DenseVector[Double]]],
DenseVector[DenseVector[Double]],
That])
几乎可以肯定,乘法的操作数不是您想要的。 LHS 是一个 DenseVector,其元素是转置的 DenseVector。 RHS 是一个DenseVector[DenseVector[Double]]
。您的外部 DenseVector(..) 调用将其参数包装在新的 DenseVector 中,而不是将参数转换为 DenseVector。
我相信这就是您想要的:
val diff = (vector - mi).toDenseVector
(diff.t * invCovMatrix * diff)
关于Scala 错误找不到参数的隐式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29009094/