Двигатель Mahout Recomendaton рекомендует продукты и их количество для клиента

Я работаю над вариантом использования механизма рекомендаций по mahout. Я предварительно вычислил рекомендации и сохранил в базе данных. сейчас я планирую со вкусом отдыхать, чтобы у.net.i было ограниченное количество клиентов и продуктов. Это случай использования рекомендаций на уровне дистрибьютора. Мой вопрос: придет ли новый дистрибьютор, как я буду предлагать ему рекомендации, а также как Я предлагаю количество рекомендуемого продукта для каждого дистрибьютора. Не могли бы вы, люди, дать мне некоторые рекомендации. Я столкнусь с проблемами производительности..?

2 ответа

Решение

Одним из способов является, когда приходит новый пользователь, предварительно рассчитать рекомендации с нуля для всех пользователей или только для этого пользователя. Вы должны знать, что этот пользователь может изменить рекомендации для других. Это зависит от ваших потребностей, часто вы хотите сделать предварительные вычисления.

Однако, если у вас ограниченное количество пользователей и элементов, другой способ - использовать онлайн-рекомендатель, который вычисляет рекомендации в режиме реального времени. Если вы используете FileDataModelСуществует возможность периодически получать данные от нового пользователя (см. книгу " Махут в действии"). Если вы используете в модели данных памяти, которая работает быстрее, вы можете переопределить методы: setPreference(long userID, long itemID, float value) а также removePreference(long userID, long itemID)и всякий раз, когда новый пользователь приходит и любит или удаляет некоторые элементы, вы должны вызывать эти методы в вашей модели данных.

РЕДАКТИРОВАТЬ: в основном вы можете получить GenericDataModelи добавить это к методам setPreference а также removePreference, Это будет ваша модель данных более низкого уровня. Вы можете обернуть его потом с ReloadFromJDBCDataModel установив модель данных в reload() метод как это:

DataModel newDelegateInMemory = Delegate.hasPreferenceValues ​​()? new MutableDataModel(делегат.exportWithPrefs()): новый MutableBooleanPrefDataModel(делегат.exportWithIDsOnly());

Переопределенные методы:

@Override
public void setPreference(long userID, long itemID, float value) {

    userIDs.add(userID);
    itemIDs.add(itemID);

    setMinPreference(Math.min(getMinPreference(), value));
    setMaxPreference(Math.max(getMaxPreference(), value));

    Preference p = new GenericPreference(userID, itemID, value);

    // User preferences
    GenericUserPreferenceArray newUPref;
    int existingPosition = -1;
    if (preferenceFromUsers.containsKey(userID)) {
        PreferenceArray oldPref = preferenceFromUsers.get(userID);
        newUPref = new GenericUserPreferenceArray(oldPref.length() + 1);
        for (int i = 0; i < oldPref.length(); i++) {
            //If the item does not exist in the liked user items, add it!
            if(oldPref.get(i).getItemID()!=itemID){
                newUPref.set(i, oldPref.get(i));
            }else{
                //Otherwise remember the position
                existingPosition = i;
            }
        }
        if(existingPosition>-1){
            //And change the preference value
            oldPref.set(existingPosition, p);
        }else{
            newUPref.set(oldPref.length(), p);
        }
    } else {
        newUPref = new GenericUserPreferenceArray(1);
        newUPref.set(0, p);
    }
    if(existingPosition == -1){
        preferenceFromUsers.put(userID, newUPref);
    }

    // Item preferences
    GenericItemPreferenceArray newIPref;
    existingPosition = -1;
    if (preferenceForItems.containsKey(itemID)) {
        PreferenceArray oldPref = preferenceForItems.get(itemID);
        newIPref = new GenericItemPreferenceArray(oldPref.length() + 1);
        for (int i = 0; i < oldPref.length(); i++) {
            if(oldPref.get(i).getUserID()!=userID){
                newIPref.set(i, oldPref.get(i));
            }else{
                existingPosition = i;
            }
        }
        if(existingPosition>-1){
            oldPref.set(existingPosition, p);
        }else{
            newIPref.set(oldPref.length(), p);
        }
    } else {
        newIPref = new GenericItemPreferenceArray(1);
        newIPref.set(0, p);
    }
    if(existingPosition == -1){
        preferenceForItems.put(itemID, newIPref);
    }   
}

@Override
public void removePreference(long userID, long itemID) {
    // User preferences
    if (preferenceFromUsers.containsKey(userID)) {
        List<Preference> newPu = new ArrayList<Preference>();
        for (Preference p : preferenceFromUsers.get(userID)) {
            if(p.getItemID()!=itemID){
                newPu.add(p);
            }       
        }
        preferenceFromUsers.remove(userID);
        preferenceFromUsers.put(userID, new GenericUserPreferenceArray(newPu)); 
    }
    if(preferenceFromUsers.get(userID).length()==0){
        preferenceFromUsers.remove(userID);
        userIDs.remove(userID); 
    }
    if (preferenceForItems.containsKey(itemID)) {
        List<Preference> newPi = new ArrayList<Preference>();
        for (Preference p : preferenceForItems.get(itemID)) {
            if(p.getUserID() != userID){
                newPi.add(p);
            }   
        }
        preferenceForItems.remove(itemID);
        preferenceForItems.put(itemID, new GenericItemPreferenceArray(newPi));
    }   
    if(preferenceForItems.get(itemID).length()==0){
        //Not sure if this is needed, but it works without removing the item
        //preferenceForItems.remove(itemID);
        //itemIDs.remove(itemID);
    }
}

Если под "новым дистрибьютором" вы имеете в виду, что у вас нет данных для них, нет исторических данных. Тогда вы не можете давать рекомендации, используя рекомендации Mahout.

Вы можете предложить другие предметы, как только они выбрали один. Используйте драйвер Mahouts "itemsmagnity", чтобы вычислить похожие элементы для всего в вашем каталоге. Затем, если они выбирают что-то, вы можете предложить аналогичные предметы

Элементы, полученные из драйвера элементов сходства, могут храниться в вашей БД в виде значения столбца, содержащего идентификаторы для похожих элементов для каждого элемента. Затем вы можете индексировать столбец с помощью поисковой системы и использовать первый заказ пользователя в качестве запроса. Это вернет персональные рекомендации в реальном времени и является самым современным методом, предложенным людьми из Mahout.

Смотрите описание того, как это сделать, в этой книге Теда Даннинга, одного из ведущих ученых-исследователей Mahout. http://www.mapr.com/practical-machine-learning

Другие вопросы по тегам