2014-09-03 14 views
9

Tak buduję niejawny modelu Spark feedback Recommender z 1.0.0 i staram się naśladować przykład mają one na ich wspólnych stronie filtrowania: http://spark.apache.org/docs/latest/mllib-collaborative-filtering.html#explicit-vs-implicit-feedbackSpark MLlib - Collaborative Filtering niejawny Kanał

I nawet zestaw danych testu załadowane których odwoływać się do przykładu: http://codesearch.ruethschilling.info/xref/apache-foundation/spark/mllib/data/als/test.data

jednak kiedy próbuję uruchomić ukrytą modelu zwrotne: val alfa = 0,01 Model val = ALS.trainImplicit (ocen, ranking, numIterations, alfa)

(ratingi były wskaźniki dokładnie z ich zbiorze i rangi = 10, numIterations = 20) otrzymuję następujący błąd:

scala> val model = ALS.trainImplicit(ratings, rank, numIterations, alpha) 
<console>:26: error: overloaded method value trainImplicit with alternatives: 
(ratings: org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating],rank: Int,iterations: Int)org.apache.spark.mllib.recommendation.MatrixFactorizationModel <and> 
(ratings: org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating],rank: Int,iterations: Int,lambda: Double,alpha: Double)org.apache.spark.mllib.recommendation.MatrixFactorizationModel <and> 
(ratings: org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating],rank: Int,iterations: Int,lambda: Double,blocks: Int,alpha: Double)org.apache.spark.mllib.recommendation.MatrixFactorizationModel <and> 
(ratings: org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating],rank: Int,iterations: Int,lambda: Double,blocks: Int,alpha: Double,seed: Long)org.apache.spark.mllib.recommendation.MatrixFactorizationModel 
cannot be applied to (org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating], Int, Int, Double) 
val model = ALS.trainImplicit(ratings, rank, numIterations, alpha) 

Co ciekawe, model ten działa dobrze, gdy nie robi trainImplicit (tj ALS.train)

Odpowiedz

4

Przykład wydaje się być niezsynchronizowany z implementacją, ponieważ nie ma przeciążeń trainImplicit z czterema parametrami - co jest tym, co mówi komunikat o błędzie. Jeśli jednak spojrzeć na Scala source code for ALS zobaczysz, że przeciążenie trzy parametr jest realizowany w warunkach przeciążenia sześć parametrów przez niektórych „magicznych liczb”:

def trainImplicit(ratings: RDD[Rating], rank: Int, iterations: Int) 
    : MatrixFactorizationModel = { 
    trainImplicit(ratings, rank, iterations, 0.01, -1, 1.0) 
} 

Sugeruje to, że 0,01 jest przyzwoity wartość domyślną lambda. (Być może dobrze sprawdzić u kogoś, kto lepiej rozumie ML). To może dostarczyć wystarczającej ilości informacji, aby połączyć rozsądne wezwanie do przeciążenia pięciu lub sześciu parametrów. (Oczywiście, jeśli wiesz, wystarczy wybrać lepsze wartości, to świetnie!)

Na przykład:

val model = ALS.trainImplicit(ratings, rank, numIterations, 0.01, alpha) 

lub

val model = ALS.trainImplicit(ratings, rank, numIterations, 0.01, -1, alpha) 

Wreszcie, nie może zrozumieć, że nie jest całkiem przyzwoity API documentaiton for ALS.

+0

Doskonałe, obliczenia "liczb magicznych" działają dobrze! Dziękuję bardzo za pomoc !! – atellez

+0

Tak 0,01 to dobra wartość domyślna dla lambda. –