首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mahout Recomendaton发动机向客户推荐产品及其数量

Mahout Recomendaton发动机向客户推荐产品及其数量
EN

Stack Overflow用户
提问于 2014-09-01 07:58:30
回答 2查看 143关注 0票数 0

我正在开发mahout推荐引擎用例,我预先计算了建议并存储在数据库中。现在,我正计划向.net.i提供具有品味的rest服务,向有限的客户提供rest服务,products.it是发行商级的推荐使用case.my问题是,如果新的发行商进来,我将如何向him.and建议建议,以及如何向每个distributor.could建议推荐产品的数量--大家给我一些guidance.am --我要面对性能问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-01 13:16:53

一种方法是,当新用户出现时,从零开始为所有用户或仅为该用户预先计算建议。您应该知道,该用户可能也会更改其他用户的建议。这取决于你的需要经常你想做的预计算。

但是,如果您的用户和项目数量有限,另一种方法是让在线推荐程序实时计算建议。如果您使用FileDataModel,有一种方法可以定期从新用户那里获取数据(请参阅图书行动中的马赫特)。如果在更快的内存数据模型中使用,则可以重写方法:setPreference(long userID, long itemID, float value)removePreference(long userID, long itemID),每当新用户出现并喜欢或删除某些项时,就应该在数据模型上调用这些方法。

编辑:基本上您可以获得GenericDataModel,并将其添加到setPreferenceremovePreference方法中。这将是您较低级别的数据模型。之后,您可以通过在ReloadFromJDBCDataModel方法中设置数据模型来封装它,如下所示:

DataModel newDelegateInMemory = delegate.hasPreferenceValues()?新MutableBooleanPrefDataModel(delegate.exportWithIDsOnly());(delegate.exportWithPrefs())

重写的方法:

代码语言:javascript
复制
@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);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-09-02 14:38:59

如果“新发行商”的意思是你没有他们的数据,没有历史数据。那么您就不能使用Mahout的推荐人来提出建议。

你可以建议其他项目,一旦他们选择一个。使用Mahout的“项目相似”驱动程序为目录中的所有内容计算相似的项目。然后,如果他们选择的东西,你可以建议类似的项目。

来自项目相似驱动程序的项可以作为列值存储在您DB中,列值包含每个项的类似项的in。然后,您可以使用搜索引擎对列进行索引,并使用用户的第一个顺序作为查询。这将返回实时个性化推荐,是马赫特人建议的最最新的方法。

在这本书中,特德·邓宁( Ted )介绍了如何做到这一点。邓宁是马赫特( Mahout )的主要数据科学家之一。http://www.mapr.com/practical-machine-learning

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25601249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档