我工作的象夫的推荐引擎使用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