5

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ます。

4

4 に答える 4

2

Breeze は、さまざまな操作の互換性のある型を決定するために、暗黙的なもの (それらに慣れていない場合は読んでください) に大きく依存しています。明らかに、呼び出している演算子にはそのような暗黙のパラメーターが必要であり、コンパイラーはスコープ内でパラメーターを見つけることができません。したがって、次の 2 つのオプションがあります。

  1. メソッドにない暗黙的なパラメーターを生成するインポートがありません。

  2. 互換性のない型を乗算しようとしていますが、適切な暗黙のパラメーターが存在しません。たとえば、このチュートリアルでは次のことについて言及しています。

互換性のないカーディナリティまたはより大きな数値型の割り当てはコンパイルされません。

scala> m := x :13: エラー: パラメータ op の暗黙的な値が見つかりませんでした: Breeze.linalg.operators.BinaryUpdateOp[breeze.linalg.DenseMatrix[Int],breeze.linalg.DenseVector[Double],breeze.linalg.演算子.OpSet] m := x ^

一方で、コンパイラがこの種の互換性のエラーを選択できるのは良いことですが、悲しいことに、得られるエラーはほとんどわかりません。

于 2015-03-12T15:08:19.420 に答える
1

私もこの問題に遭遇し、Breeze から同じエラー メッセージが表示されます。私の場合、X 型は DenseVector[Double] で、Y 型は DenseVector[Int] です。Y 型を DenseVector[Double] に変更すると、このエラーは消えます。これがあなたを助けることを願っています。

于 2017-02-28T08:52:58.937 に答える