Sau*_*cci 5 scala scala-breeze apache-spark
我有flagVectorOutlier如下代码所示的功能。我正在使用 BreezeDenseVector和DenseMatrix对象来计算distance. 我希望在函数签名上编码,以获得 Spark RDD[(Double, Boolean)]。mi和invCovMatrix分别是微风的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
}
Run Code Online (Sandbox Code Playgroud)
编译器最终向我展示了以下 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
^
Run Code Online (Sandbox Code Playgroud)
和
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
^
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我正在考虑DenseVector以这种方式在 Breeze's 之间进行乘法运算。
Breeze 严重依赖隐式(如果您不熟悉它们,请阅读这些隐式)来确定不同操作的兼容类型。显然,您调用的运算符需要这样一个隐式参数,而编译器无法在范围内找到一个隐式参数。所以有两个选择:
您缺少一个导入,它将产生该方法缺少的隐式参数。
您正在尝试乘以不兼容的类型,并且不存在正确的隐式参数。例如,本教程提到以下内容:
具有不兼容基数或较大数字类型的赋值将无法编译。
scala> m := x :13: 错误:找不到参数 op 的隐式值:breeze.linalg.operators.BinaryUpdateOp[breeze.linalg.DenseMatrix[Int],breeze.linalg.DenseVector[Double],breeze.linalg。运算符.OpSet] m := x ^
一方面,让编译器能够识别这种兼容性错误是件好事,但遗憾的是,您得到的错误很难说明问题。
| 归档时间: |
|
| 查看次数: |
7299 次 |
| 最近记录: |