Scala 错误找不到参数的隐式值

标签 scala apache-spark scala-breeze

我有函数flagVectorOutlier,如下面的代码所示。我使用 Breeze 的 DenseVectorDenseMatrix 对象来计算 distance 的值。我希望按照函数签名上的编码,获得 Spark RDD[(Double, Boolean)]miinvCovMatrix 分别是 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/

相关文章:

java - Assets 反向路由中的动态文件路径

hadoop - yarn 中的节点状态是什么?

amazon-s3 - 使用 hive 或 prestodb 加载或指向多个 parquet 路径以进行数据分析

scala - 将多项式分布与 Scala 和 Breeze 包一起使用

scala - 如何将 RowMatrix 转换为 BDM(Breeze Dense Matrix)以及更多问题

scala - 在哪里可以找到表示自然数的类型?

java - 调用 Java/Scala 方法的最早方法是什么?

scala - scala中空特征的目的是什么

hadoop - 无法保留HIVE表