Создание модели для коллаборативной фильтрации User User - PullRequest
1 голос
/ 28 марта 2012

Я хочу сделать своего рода совместную фильтрацию пользователя-пользователя, в которой пользователи в матрице пользовательских элементов являются выбранной частью целых пользователей в базе данных.Эти выбранные пользователи регулярно обновляются с настройками вновь выбранных пользователей.Новые пользователи не должны быть добавлены в матрицу.Для нового пользователя, исходя из его предпочтений, мы должны рекомендовать элементы из матрицы пользовательских элементов (которая имеет только часть выбранных пользователей).Я не хочу добавлять новых анонимных пользователей в матрицу.

Изучено в Mahout, но мне нужна помощь там.Класс Recommender в Mahout имеет метод Recommended (...), который принимает user_id в качестве аргумента.Это не то, что я хочу.Метод должен принимать предпочтения и в зависимости от модели следует рекомендовать элементы.Как это сделать в Mahout ??Можем ли мы использовать PlusAnonymousUserDataModel ??

Если не mahout, какие другие инструменты могут выполнить это ...

Код, который я использовал с PlusAnonymousUserDataModel, который не дает никаких рекомендаций для пользователя, у которого есть рекомендации при обычном использовании ..

    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);

Есть ли проблемы с кодом ??

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Да, PlusAnonymousUserDataModel - это самое близкое к тому, что вы хотите в Махоуте. Это что-то вроде лейкопластыря, но работает.

1 голос
/ 24 октября 2012

sravan_kumar, если вы замените model на plusAnonymousModel в 3 местах:
TanimotoCoefficientShoity Подобие = новый TanimotoCoefficientShoity (plusAnonymousModel);
UserNeighborhood окрестности = новый NearestNUserNeighborhood (1000, сходство, плюс AnonymousModel);
Recommender Recommender1 = new GenericBooleanPrefUserBasedRecommender (plusAnonymousModel, окрестность, сходство);

и инициализируйте plusAnonymousModel сразу после инициализации модели:
PlusAnonymousUserDataModel plusAnonymousModel = новый PlusAnonymousUserDataModel (модель);
(нет необходимости в переменной plusmodel, как вы ее используете)
, вы получите желаемый результат!

Кроме того, измените GenericUserPreferenceArray на BooleanUserPreferenceArray:)

...