斯卡拉错误 找不到参数的隐式值



我有函数flagVectorOutlier,如下面的代码所示。我正在使用 Breeze 的DenseVectorDenseMatrix对象来计算distance的值。我希望按照函数签名上的编码,获得 Spark RDD[(Double, Boolean)] . miinvCovMatrix分别是微风的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,其元素是Transpose'd DenseVectors。RHS是一个DenseVector[DenseVector[Double]].您的外部 DenseVector(..) 调用将它们的参数包装在新的 DenseVectors 中,而不是将参数转换为 DenseVector。

我相信这就是你想要的:

val diff = (vector - mi).toDenseVector
(diff.t * invCovMatrix * diff)

Breeze在很大程度上依赖于隐式(如果您不熟悉它们,请阅读它们)来确定不同操作的兼容类型。显然,您调用的运算符需要这样的隐式参数,而编译器无法在范围内找到一个。所以有两种选择:

  1. 您缺少一个导入,该导入将生成该方法缺少的隐式参数。

  2. 您正在尝试将不兼容的类型相乘,并且不存在正确的隐式参数。例如,本教程提到了以下内容:

基数不兼容或数值类型较大的赋值将无法编译。

斯卡拉> m := x :13: 错误: 找不到参数 op: breeze.linalg.operator.BinaryUpdateOp[breeze.linalg.DenseMatrix[Int],breeze.linalg.DenseVector[Double],breeze.linalg.operator.OpSet] m := x ^

一方面,让编译器能够选择这种兼容性错误是件好事,但遗憾的是,你得到的错误很难说明问题。

我也遇到了这个问题,微风给了我同样的错误消息。就我而言,我的 X 类型是 DenseVector[Double],而 Y 类型是 DenseVector[Int],在我将 Y 类型更改为 DenseVector[Double] 后,此错误消失了。希望这能帮助你。

你应该明确声明类型如下,关注变量AB

package com.tencent.ieg.dm.demo
import breeze.linalg.{Vector, DenseVector, SparseVector}
object BreezeDemo extends App {
    val a:Vector[Long] = DenseVector(2, 10, 3)
    // val a = DenseVector(2, 10, 3) // cause compiling error
    val b:Vector[Long] = new SparseVector(Array(0),Array(2),3)
    val rst = a dot b
    println(rst)
}

相关内容

最新更新