我正在开发mahout推荐引擎用例,我预先计算了建议并存储在数据库中。现在,我正计划向.net.i提供具有品味的rest服务,向有限的客户提供rest服务,products.it是发行商级的推荐使用case.my问题是,如果新的发行商进来,我将如何向him.and建议建议,以及如何向每个distributor.could建议推荐产品的数量--大家给我一些guidance.am --我要面对性能问题?
发布于 2014-09-01 13:16:53
一种方法是,当新用户出现时,从零开始为所有用户或仅为该用户预先计算建议。您应该知道,该用户可能也会更改其他用户的建议。这取决于你的需要经常你想做的预计算。
但是,如果您的用户和项目数量有限,另一种方法是让在线推荐程序实时计算建议。如果您使用FileDataModel,有一种方法可以定期从新用户那里获取数据(请参阅图书行动中的马赫特)。如果在更快的内存数据模型中使用,则可以重写方法:setPreference(long userID, long itemID, float value)和removePreference(long userID, long itemID),每当新用户出现并喜欢或删除某些项时,就应该在数据模型上调用这些方法。
编辑:基本上您可以获得GenericDataModel,并将其添加到setPreference和removePreference方法中。这将是您较低级别的数据模型。之后,您可以通过在ReloadFromJDBCDataModel方法中设置数据模型来封装它,如下所示:
DataModel newDelegateInMemory = delegate.hasPreferenceValues()?新MutableBooleanPrefDataModel(delegate.exportWithIDsOnly());(delegate.exportWithPrefs())
重写的方法:
@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);
}
}发布于 2014-09-02 14:38:59
如果“新发行商”的意思是你没有他们的数据,没有历史数据。那么您就不能使用Mahout的推荐人来提出建议。
你可以建议其他项目,一旦他们选择一个。使用Mahout的“项目相似”驱动程序为目录中的所有内容计算相似的项目。然后,如果他们选择的东西,你可以建议类似的项目。
来自项目相似驱动程序的项可以作为列值存储在您DB中,列值包含每个项的类似项的in。然后,您可以使用搜索引擎对列进行索引,并使用用户的第一个顺序作为查询。这将返回实时个性化推荐,是马赫特人建议的最最新的方法。
在这本书中,特德·邓宁( Ted )介绍了如何做到这一点。邓宁是马赫特( Mahout )的主要数据科学家之一。http://www.mapr.com/practical-machine-learning
https://stackoverflow.com/questions/25601249
复制相似问题