1

ich ein Daten über Benutzereinstellungen habe für bestimmte Elemente in der Form:Wie am ähnlichsten Benutzer empfehlen Spark-ML mit

user, item, preference 
1, 75, 0.89 
2, 168, 0.478 
2, 99, 0.321 
3, 31, 0.012 

Für jeden Benutzer muß ich einen Top-N am ähnlichsten Benutzer machen auf der Grundlage ihres Präferenzen. Das System hat Tausende von Benutzern und Artikeln. Empfehlungen würden im Batch-Prozess generiert und auf Elasticsearch bereitgestellt. In Mahout, einfachen Algorithmus, der es tun würde, könnte wie folgt aussehen:

val similarity:UserSimilarity=new PearsonCorrelationSimilarity(dataModel) 
    val neighborhood:UserNeighborhood = new ThresholdUserNeighborhood(0.75, similarity, dataModel) 
    val userBasedRecommender:UserBasedRecommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity); 
    val userid=1 
    val howMany=10 
    val mostSimilarUserIDs = userBasedRecommender.mostSimilarUserIDs(userid, howMany); 

ich umsetzen mag, dass Spark-ML mit, konnte aber kein ähnliches Beispiel finden, die mir weitergehen helfen könnte.

Bisher habe ich umgesetzt Ansatz Kosinusähnlichkeit verwenden, die ein Benutzer verfügt über Vektor mit anderen Nutzern vergleichen:

def cosineSimilarity(vec1: DoubleMatrix, vec2: DoubleMatrix): Double= 
{ 
    vec1.dot(vec2)/(vec1.norm2()*vec2.norm2()) 
} 
def user2usersimilarity(userid:Integer, recNumber:Integer): Unit ={ 
    val userFactor=model.userFeatures.lookup(userid).head 
    val userVector=new DoubleMatrix(userFactor) 
    val s1=cosineSimilarity(userVector,userVector) 
    val sims=model.userFeatures.map{case(id,factor)=> 
     val factorVector=new DoubleMatrix(factor) 
     val sim=cosineSimilarity(factorVector, userVector) 
     (id,sim) 
    } 
    val sortedSims=sims.top(recNumber+1)(Ordering.by[(Int, Double),Double] {case(id, similarity)=>similarity}) 
    println(sortedSims.slice(1,recNumber+1).mkString("\n")) 
} 

Dieser Ansatz funktioniert gut mit dem Movielens-Datensatz in Bezug auf die Qualität der Empfehlungen. Meine Sorge bezieht sich jedoch auf die Leistung eines solchen Algorithmus. Da ich Empfehlungen für alle Benutzer im System generieren muss, würde ich mit diesem Ansatz jeden Benutzer mit allen anderen Benutzern im System vergleichen.

Ich würde mich freuen, wenn jemand vorschlagen könnte, wie man den Vergleich des Benutzers mit Top-N-Nachbarn oder einem anderen Algorithmus, der in meinem Anwendungsfall besser funktioniert, einschränkt.

Antwort

1

Wie wäre es mit einem Clustering-Algorithmus?, Einmal trainieren, Modell bereitstellen, Modell verwenden, um zu identifizieren, in welchem ​​Cluster ein neues Beispiel gehört, und dann nach dem Zufallsprinzip Benutzer im selben Cluster empfehlen? Es ist nur eine Idee ...

+0

Eigentlich ist das etwas, was ich vor ein paar Tagen umgesetzt habe. Obwohl meine Lösung zwei Modelle verwendet. Der erste verwendet Spark ML K-means, um Cluster von Schülern basierend auf den Kursen zu identifizieren, denen sie zugewiesen sind. In der nächsten Iteration wird das ALS-Modell verwendet, um Benutzer aus demselben Cluster zu empfehlen, die demselben Cluster angehören. –

0

Werfen Sie einen Blick auf Spark-Collaborative Filtering mit Alternating Least Squares: http://spark.apache.org/docs/latest/ml-collaborative-filtering.html

es genau für diesen Fall gebaut wird.

Collaborative Filtering

Collaborative Filtering für Empfehlungssysteme verwendet. Diese Techniken zielen darauf ab, die fehlenden Einträge einer User-Item Zuordnungsmatrix auszufüllen. spark.ml unterstützt derzeit modellbasierte kollaborative Filterung, in der Benutzer und Produkte von eine kleine Menge von latenten Faktoren beschrieben werden, die verwendet werden können, um fehlende Einträge vorherzusagen. spark.ml verwendet den Alternating Least Squares (ALS) -Algorithmus , um diese latenten Faktoren zu lernen.

Da Sie tatsächliche Präferenzen/Bewertungen haben Sie den explizite Vorlieben Ansatz verwenden können (im Gegensatz zu impliziten).