開發者API示例(https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/DeveloperApiExample.scala)給出了分類模型中函數predictRaw()的簡單實現示例。這是抽象類ClassificationModel中必須在具體類中實現的功能。根據顯影劑API例如,可以按以下方法計算它:嘗試在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).
}
我的BLAS.dot(features, coefficients)
理解的是,這僅僅是特徵向量(長度numFeatures的)的矩陣點積由係數向量(長度的numFeatures),因此有效地將每個「特徵」列以一個係數加以摺疊,然後求和得到val margin
。然而,Spark不再提供對BLAS庫的訪問權限,因爲它在MLlib中是私有的,而Matrix Matrix中提供了多種工廠方法進行乘法的矩陣mutliplication。
我如何使用矩陣工廠方法來實現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
只是一個零向量,但是一旦我實現了學習算法,這將包含結果。