2014-09-01 71 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