![](/img/trans.png)
[英]Scala compile error - could not find implicit value for evidence parameter of type
[英]Scala error Could not find implicit value for parameter
我有函數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,其元素是Transpose'denseVectors。 RHS是DenseVector[DenseVector[Double]]
。 您的外部DenseVector(..)調用將其參數包裝在新的DenseVectors中,而不是將參數轉換為DenseVector。
我相信這就是你想要的:
val diff = (vector - mi).toDenseVector
(diff.t * invCovMatrix * diff)
Breeze在很大程度上依賴於implicits(如果您不熟悉它們,請閱讀這些內容)以確定不同操作的兼容類型。 顯然,您調用的運算符需要這樣的隱式參數,並且編譯器無法在范圍內找到一個。 所以有兩種選擇:
您缺少導入,該導入將生成缺少該方法的隱式參數。
您正在嘗試將不兼容的類型相乘,並且不存在正確的隱式參數。 例如, 本教程提到以下內容:
具有不兼容基數或更大數字類型的分配將無法編譯。
scala> m:= x:13:錯誤:找不到參數op的隱式值:breeze.linalg.operators.BinaryUpdateOp [breeze.linalg.DenseMatrix [Int],breeze.linalg.DenseVector [Double],breeze.linalg。 operators.OpSet] m:= x ^
一方面很高興讓編譯器能夠選擇這種兼容性錯誤,但遺憾的是你得到的錯誤並不是很有說服力。
你應該明確地聲明類型如下,重點關注變量a和b :
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.