Пакет рекомендаций pyspark ml включает реализацию ALS, основанную на статье Ху, Корена и Волинского: http://yifanhu.net/PUB/cf.pdf для наборов данных неявной обратной связи.
https://spark.apache.org/docs/2.3.0/ml-collaborative-filtering.html https://spark.apache.org/docs/2.3.1/api/python/_modules/pyspark/mllib/recommendation.html
Какую точную форму использует искра для генерации матрицы достоверности из матрицы наблюдений и параметра альфа, который контролирует степень достоверности?Использует ли spark 1 + alpha * r_ui для всех значений r_ui (ноль и ненулевое значение) или что-то еще?
Предполагается, что реализация здесь задана в строке 1683: https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala
у нас есть:
if (implicitPrefs) {
// Extension to the original paper to handle rating < 0. confidence is a function
// of |rating| instead so that it is never negative. c1 is confidence - 1.
val c1 = alpha * math.abs(rating)
// For rating <= 0, the corresponding preference is 0. So the second argument of add
// is only there for rating > 0.
if (rating > 0.0) {
numExplicits += 1
}
ls.add(srcFactor, if (rating > 0.0) 1.0 + c1 else 0.0, c1)
} else {
ls.add(srcFactor, rating)
numExplicits += 1
}
Почему третий аргумент ls.add () передается как c1, а не 1 + c1?Посмотрим, как ls.add () работает с классом NormalEquation в строке 850:
def add(a: Array[Float], b: Double, c: Double = 1.0): this.type = {
require(c >= 0.0)
require(a.length == k)
copyToDouble(a)
blas.dspr(upper, k, c, da, 1, ata)
if (b != 0.0) {
blas.daxpy(k, b, da, 1, atb, 1)
}
this
}
, почему имеет смысл использовать c1 = alpha * | rating |вместо 1 + c1, в вызове blas.dspr ()?