開発者APIの例(https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/DeveloperApiExample.scala)は、分類モデルの関数predictRaw()の簡単な実装例を示しています。これは抽象クラスClassificationModel内の関数であり、具体クラスで実装する必要があります。次のように開発者向けAPIの例によれば、あなたはそれを計算することができます。BLAS.dot(features, coefficients)
のApache Sparkで分類モデルのpredictRaw()を実装しようとしています
override def predictRaw(features: Features.Type): Vector = {
val margin = BLAS.dot(features, coefficients)
Vectors.dense(-margin, margin) // Binary classification so we return a length-2 vector, where index i corresponds to class i (i = 0, 1).
}
私の理解では、これは単に長さの係数ベクトルによって(長さnumFeaturesの)機能ベクトルの行列内積(であるということですnumFeatures)ので、効果的にそれぞれの 'フィーチャー' colsは係数によって差し引かれ、合計されてval margin
になります。しかし、SparkはMLlibでプライベートであるためBLASライブラリへのアクセスを提供しなくなり、Matrixの特性には行列乗法が提供されます。行列の乗法には、乗算のためのさまざまなファクトリメソッドがあります。
次のように行列のファクトリメソッドを使用してpredictRaw()
を実装する方法の私の理解では、次のとおりです。
override def predictRaw(features: Vector): Vector = {
//coefficients is a Vector of length numFeatures: val coefficients = Vectors.zeros(numFeatures)
val coefficientsArray = coefficients.toArray
val coefficientsMatrix: SparkDenseMatrix = new SparkDenseMatrix(numFeatures, 1, coefficientsArray)
val margin: Array[Double] = coefficientsMatrix.multiply(features).toArray // contains a single element
val rawPredictions: Array[Double] = Array(-margin(0),margin(0))
new SparkDenseVector(rawPredictions)
}
これは、配列にデータ構造を変換するオーバーヘッドが必要になります。より良い方法がありますか? BLASは現在非公開です。 NB。コードはテストされていません!現時点ではval coefficients: Vector
はちょうどゼロのベクトルですが、学習アルゴリズムを実装すると結果が含まれます。