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.
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. –