繁体   English   中英

Scala错误无法找到参数的隐式值

[英]Scala error Could not find implicit value for parameter

我有函数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,其元素是Transpose'denseVectors。 RHS是DenseVector[DenseVector[Double]] 您的外部DenseVector(..)调用将其参数包装在新的DenseVectors中,而不是将参数转换为DenseVector。

我相信这就是你想要的:

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

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

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

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

具有不兼容基数或更大数字类型的分配将无法编译。

scala> m:= x:13:错误:找不到参数op的隐式值:breeze.linalg.operators.BinaryUpdateOp [breeze.linalg.DenseMatrix [Int],bre​​eze.linalg.DenseVector [Double],bre​​eze.linalg。 operators.OpSet] m:= x ^

一方面很高兴让编译器能够选择这种兼容性错误,但遗憾的是你得到的错误并不是很有说服力。

你应该明确地声明类型如下,重点关注变量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)

}

我也遇到了这个问题,Breeze给了我同样的错误信息。 在我的情况下,我的X类型是DenseVector [Double],而Y类型是DenseVector [Int],在我将Y类型更改为DenseVector [Double]后,此错误消失。 希望这可以帮到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM