2014-09-01 36 views
-1

我工作的象夫的推荐引擎使用case.I预先计算的建议,并存储在数据库中。现在我正打算将品味休息服务暴露给.net.i有限的客户和products.it是分销商级别的推荐用例。我的问题是,如果新的分销商进来,我将如何向他建议的建议。我向每个经销商建议推荐产品的数量。您可以给我一些指导。我将面对性能问题..?亨利马乌Recomendaton引擎推荐的产品和其数量客户

回答

0

的一种方法是,当新用户到来的时候,预先计算所有用户或只为这个用户从无到有的建议。你应该知道这个用户可能也会改变其他人的建议。它经常需要您进行预先计算。

但是,如果你有有限的用户和项目的数量,另一种方式是在网上推荐的是实时计算的建议。如果您使用FileDataModel,则可以定期从新用户获取数据(请参阅书籍Mahout in Action)。如果您在内存数据模型中使用速度更快,则可以覆盖以下方法:setPreference(long userID, long itemID, float value)removePreference(long userID, long itemID),并且每当新用户出现并喜欢或删除某些项目时,都应在数据模型上调用这些方法。

编辑:基本上,你可以得到GenericDataModel,这增加了方法setPreferenceremovePreference。这将是您的较低级别的数据模型。

的DataModel newDelegateInMemory = delegate.hasPreferenceValues() :您可以通过在reload()方法是这样设置你的数据模型与ReloadFromJDBCDataModel后来换了吗?新的MutableDataModel(delegate.exportWithPrefs()) :new MutableBooleanPrefDataModel(delegate.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); 
    } 
} 
+0

感谢德拉甘,目前我正在努力发展与Rest.I我打算使用内存的实时推荐引擎数据model.can请您分享您实现一个供我参考。 – 2014-09-02 06:32:12

+0

我编辑了我的答案。检查代码。 – 2014-09-02 07:47:40

0

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

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

是来自itemsimilarity驱动程序的项目可以存储在你的数据库包含的每个项目类似的项目ID的列值。然后,您可以使用搜索引擎对列进行索引,并将用户的第一个订单用作查询。这将返回实时个性化推荐,并且是Mahout人员建议的最新方法。

查看如何做到这本书由Ted邓宁,领先亨利马乌数据科学家的一个描述。 http://www.mapr.com/practical-machine-learning

+0

感谢您的建议。我明白了你的观点。我的其他疑问是我正在尝试使用Java,Web services.I不使用搜索引擎(solr)来实现。我需要使用REST将推荐引擎暴露给.Net跨平台。我的技术是Mysql,Java Web服务Mahout。我正朝着正确的方向前进,还是我想念任何事情。 – 2014-09-03 06:44:15