我工作的象夫的推薦引擎使用case.I預先計算的建議,並存儲在數據庫中。現在我正打算將品味休息服務暴露給.net.i有限的客戶和products.it是分銷商級別的推薦用例。我的問題是,如果新的分銷商進來,我將如何向他建議的建議。我向每個經銷商建議推薦產品的數量。您可以給我一些指導。我將面對性能問題..?亨利馬烏Recomendaton引擎推薦的產品和其數量客戶
回答
的一種方法是,當新用戶到來的時候,預先計算所有用戶或只爲這個用戶從無到有的建議。你應該知道這個用戶可能也會改變其他人的建議。它經常需要您進行預先計算。
但是,如果你有有限的用戶和項目的數量,另一種方式是在網上推薦的是實時計算的建議。如果您使用FileDataModel
,則可以定期從新用戶獲取數據(請參閱書籍Mahout in Action)。如果您在內存數據模型中使用速度更快,則可以覆蓋以下方法:setPreference(long userID, long itemID, float value)
和removePreference(long userID, long itemID)
,並且每當新用戶出現並喜歡或刪除某些項目時,都應在數據模型上調用這些方法。
編輯:基本上,你可以得到GenericDataModel
,這增加了方法setPreference
和removePreference
。這將是您的較低級別的數據模型。
的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);
}
}
如果「新的分銷商」你的意思是,你對他們有沒有數據,沒有歷史數據。那麼你不能使用Mahout的推薦人提出建議。
你可以建議其他項目,一旦他們選擇一個。使用Mahout的「itemsimilarity」驅動程序計算目錄中所有內容的類似項目。那麼如果他們選擇了一些東西,你可以建議類似的項
是來自itemsimilarity驅動程序的項目可以存儲在你的數據庫包含的每個項目類似的項目ID的列值。然後,您可以使用搜索引擎對列進行索引,並將用戶的第一個訂單用作查詢。這將返回實時個性化推薦,並且是Mahout人員建議的最新方法。
查看如何做到這本書由Ted鄧寧,領先亨利馬烏數據科學家的一個描述。 http://www.mapr.com/practical-machine-learning
感謝您的建議。我明白了你的觀點。我的其他疑問是我正在嘗試使用Java,Web services.I不使用搜索引擎(solr)來實現。我需要使用REST將推薦引擎暴露給.Net跨平臺。我的技術是Mysql,Java Web服務Mahout。我正朝着正確的方向前進,還是我想念任何事情。 – 2014-09-03 06:44:15
- 1. 在亨利馬烏
- 2. 如何寫亨利馬烏推薦星火
- 3. 亨利馬烏 - 類LongPair
- 4. ClusterDump在亨利馬烏0.9
- 5. 亨利馬烏0.8和Hadoop 0.21
- 6. 訪問Apache的亨利馬烏LDA包
- 7. 亨利馬烏:正火UserSimilarity距離
- 8. 亨利馬烏LDA給FileNotFound例外
- 9. 亨利馬烏CVB主題文件
- 10. 亨利馬烏打死錯誤
- 11. 亨利馬烏:k均值聚類
- 12. 如何使用startPhase在亨利馬烏
- 13. 拋出:IllegalArgumentException在亨利馬烏
- 14. 密度亨利馬烏稀疏矩陣
- 15. 獲得成員 - 亨利馬烏
- 16. 我會如何推薦帶有Mahout產品或用戶推薦模型的客戶的產品數量
- 17. 如何採取鍵和值在中亨利馬烏
- 18. 適用於多種產品和客戶的推薦結構
- 19. 亨利馬烏0.11.1火花殼牌的NoClassDefFoundError
- 20. 亨利馬烏 - 簡單的分類問題
- 21. 亨利馬烏:java.lang.NumberFormatException:對於輸入字符串:
- 22. 亨利馬烏最小哈希org.apache.hadoop.io.LongWritable不能轉換到org.apache.hadoop.io.Text
- 23. 亨利馬烏 - 集羣 - 「命名」集羣元素
- 24. 亨利馬烏使用命令行來創建集羣 - 問題
- 25. 點亨利馬烏到HDFS,而不是本地磁盤
- 26. Python推薦引擎
- 27. Alfresco推薦引擎?
- 28. Neo4j推薦引擎
- 29. 亨利馬烏KMEANS生成一倍簇數比我的初始k-設定
- 30. Mahout:爲特定產品類別的用戶推薦產品
感謝德拉甘,目前我正在努力發展與Rest.I我打算使用內存的實時推薦引擎數據model.can請您分享您實現一個供我參考。 – 2014-09-02 06:32:12
我編輯了我的答案。檢查代碼。 – 2014-09-02 07:47:40