2012-03-28 10 views
1

Ich möchte eine Art Benutzer-Benutzer-kollaborative Filterung durchführen, wobei die Benutzer in der Benutzer-Element-Matrix ein ausgewählter Teil von ganzen Benutzern in der Datenbank sind. Diese ausgewählten Benutzer werden regelmäßig mit neu ausgewählten Benutzereinstellungen aktualisiert. Neue Benutzer sollten nicht zur Matrix hinzugefügt werden. Für einen neuen Benutzer müssen wir basierend auf seinen Präferenzen Elemente aus der Benutzer-Element-Matrix empfehlen (die nur einen Teil der ausgewählten Benutzer aufweist). Ich möchte die neuen anonymen Benutzer nicht zur Matrix hinzufügen.Modellbildung für Benutzer Benutzer kollaborative Filterung

Erforscht in Mahout, aber brauche Hilfe dort. Die Recommender-Klasse in Mahout hat eine (...) Methode empfohlen, die die user_id als Argument verwendet. Das ist nicht was ich will. Die Methode sollte die Präferenzen akzeptieren und basierend auf dem Modell sollten Elemente empfohlen werden. Wie macht man es in Mahout? Können wir PlusAnonymousUserDataModel ??

Wenn nicht Mahout, was andere Werkzeuge kann dies erreichen ...

Der Code, den ich mit PlusAnonymousUserDataModel verwendet, die keine Empfehlungen für den Benutzer geben, die Empfehlungen mit den normalen Gebrauch hat ..

DataModel model = new GenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(new FileDataModel(f))); 
    TanimotoCoefficientSimilarity similarity = new TanimotoCoefficientSimilarity(model); 
    UserNeighborhood neighborhood = new NearestNUserNeighborhood(1000, similarity, model); 
    new_user_preferences = { ... } // new user items.. 
    DataModel plusmodel = new PlusAnonymousUserDataModel(model); 
    PreferenceArray anonymousPrefs = new GenericUserPreferenceArray(new_user_preference.length); 
    anonymousPrefs.setUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID); 
    for(int i = 0;i < new_user_preference.length;i++) 
    { 
     anonymousPrefs.setItemID(i, new_user_preference[i]); 
    } 
    PlusAnonymousUserDataModel plusAnonymousModel = (PlusAnonymousUserDataModel) plusmodel; 
    Recommender recommender1 = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity); 
    plusAnonymousModel.setTempPrefs(anonymousPrefs); 
    List<RecommendedItem> recommendations1 = recommender1.recommend(plusAnonymousModel.TEMP_USER_ID, 10); 

Gibt es ein Problem mit dem Code?

Antwort

1

sravan_kumar, wenn Sie ersetzen model mit plusAnonymousModel in 3 Plätze:
TanimotoCoefficientSimilarity Ähnlichkeit = new TanimotoCoefficientSimilarity (plusAnonymousModel);
UserNeighborhood Nachbarschaft = new NearestNUserNeighborhood (1000, Ähnlichkeit, plusAnonymousModel);
Recommender recommender1 = neuer GenericBooleanPrefUserBasedRecommender (plusAnonymousModel, Nachbarschaft, Ähnlichkeit);

und initialisieren plusAnonymousModel rechten Seite, kurz nach der Initialisierung Modell:
PlusAnonymousUserDataModel plusAnonymousModel = new PlusAnonymousUserDataModel (Modell);
(es gibt keine Notwendigkeit in plusmodel Variable, wie Sie es verwenden)
, erhalten Sie die gewünschten Ergebnisse!

Auch ändern GenericUserPreferenceArray-BooleanUserPreferenceArray :)

2

Ja, PlusAnonymousUserDataModel ist das nächste, was Sie in Mahout wollen. Es ist ein bisschen Pflaster, aber funktioniert.

+0

Kann mehrere Threads die Recommender zugleich zugreifen, wenn wir PlusAnonymousUserDataModel verwenden ?? –

+0

Es ist Thread-Safe, aber es gibt eine zusätzliche Unterklasse für das, was Sie sagen. –

+0

Vielen Dank für die Antwort .. Können Sie bitte die Unterklassen und wie man es benutzt erarbeiten. Wird die PlusAnonymousUserDataModel Klasse die Matrix mit neuen Benutzer Präferenz modifizieren? –

Verwandte Themen