GenericUserBasedRecommender推荐过程分析

本文详细解析了皮尔逊积矩相关系数原理,并提供了实际代码实现,包括用户基于推荐系统中相关系数的应用。通过分析推荐算法中的关键组件,如获取邻居用户、计算相似主题评分等步骤,深入理解推荐系统的内部工作流程。

本人博客开始迁移,博客整个架构自己搭建及编码http://www.cookqq.com/listBlog.action

关于皮尔逊积矩相关系数原理分析我写了一片文章,由于图片太多,上传很麻烦,我就放在了GITHUB,地址:https://github.com/tianbaoxing/hmahout/blob/master/doc/recommder/pearsonCorrelation-%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.doc

GenericUserBasedRecommender推荐源码流程图:

GenericUserBasedRecommender中recommend推荐方法源码分析


 @Override
  public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
    Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");

    log.debug("Recommending items for user ID '{}'", userID);

    long[] theNeighborhood = neighborhood.getUserNeighborhood(userID);

    if (theNeighborhood.length == 0) {
      return Collections.emptyList();
    }

    FastIDSet allItemIDs = getAllOtherItems(theNeighborhood, userID);

    TopItems.Estimator<Long> estimator = new Estimator(userID, theNeighborhood);

    List<RecommendedItem> topItems = TopItems
        .getTopItems(howMany, allItemIDs.iterator(), rescorer, estimator);

    log.debug("Recommendations are: {}", topItems);
    return topItems;
  }



注释:(1)long[] theNeighborhood = neighborhood.getUserNeighborhood(userID) 根据用户ID查找到相应的邻居


(2) FastIDSet allItemIDs = getAllOtherItems(theNeighborhood, userID); 获取到用户邻居喜欢的主题(去掉自己喜欢的主题)

(3) List<RecommendedItem> topItems = TopItems.getTopItems(howMany, allItemIDs.iterator(), rescorer, estimator);
 

获取到评分最高的主题,推荐给用户.

现在看看那TopItems.getTopItems(howMany, allItemIDs.iterator(), rescorer, estimator);源码

 public static List<RecommendedItem> getTopItems(int howMany,
                                                  LongPrimitiveIterator possibleItemIDs,
                                                  IDRescorer rescorer,
                                                  Estimator<Long> estimator) throws TasteException {
    Preconditions.checkArgument(possibleItemIDs != null, "argument is null");
    Preconditions.checkArgument(estimator != null, "argument is null");

    Queue<RecommendedItem> topItems = new PriorityQueue<RecommendedItem>(howMany + 1,
      Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance()));
    boolean full = false;
    double lowestTopValue = Double.NEGATIVE_INFINITY;
    while (possibleItemIDs.hasNext()) {
      long itemID = possibleItemIDs.next();
      if (rescorer == null || !rescorer.isFiltered(itemID)) {
        double preference;
        try {
          preference = estimator.estimate(itemID);
        } catch (NoSuchItemException nsie) {
          continue;
        }
        double rescoredPref = rescorer == null ? preference : rescorer.rescore(itemID, preference);
        if (!Double.isNaN(rescoredPref) && (!full || rescoredPref > lowestTopValue)) {
          topItems.add(new GenericRecommendedItem(itemID, (float) rescoredPref));
          if (full) {
            topItems.poll();
          } else if (topItems.size() > howMany) {
            full = true;
            topItems.poll();
          }
          lowestTopValue = topItems.peek().getValue();
        }
      }
    }
    int size = topItems.size();
    if (size == 0) {
      return Collections.emptyList();
    }
    List<RecommendedItem> result = Lists.newArrayListWithCapacity(size);
    result.addAll(topItems);
    Collections.sort(result, ByValueRecommendedItemComparator.getInstance());
    return result;
  }

主意:IDRescorer就是在这里调用的

(1)   if (rescorer == null || !rescorer.isFiltered(itemID)) 这里主要是判断这个主题是否过滤掉.

(2)preference = estimator.estimate(itemID)计算这个用户喜欢这个主题的评分

(3)topItems.add(new GenericRecommendedItem(itemID, (float) rescoredPref)); 把主题增加到一个集合中.



















转载于:https://my.oschina.net/winHerson/blog/207081

GenericUserBasedRecommender是Mahout中提供的一种基于用户的推荐算法,可以用于预测用户对未评分物品的评分。 以下是使用GenericUserBasedRecommender实现评分预测功能的步骤: 1. 加载数据集 首先需要加载数据集,可以使用Mahout中的DataModel类来加载。 ```java DataModel model = new FileDataModel(new File("data/dataset.csv")); ``` 其中,data/dataset.csv是数据集文件的路径,需要根据实际情况修改。 2. 构建相似度矩阵 接下来需要构建用户相似度矩阵,可以使用Mahout中的UserSimilarity类来计算用户相似度。 ```java UserSimilarity similarity = new PearsonCorrelationSimilarity(model); ``` 这里使用皮尔逊相关系数作为相似度计算方法。 3. 构建推荐引擎 然后需要构建推荐引擎,可以使用Mahout中的GenericUserBasedRecommender类。 ```java UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, similarity, model); Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); ``` 其中,NearestNUserNeighborhood是一个基于最近邻的用户邻域类,这里设置邻域大小为10。 4. 预测评分 最后可以使用推荐引擎预测用户对未评分物品的评分。 ```java double score = recommender.estimatePreference(userId, itemId); ``` 其中,userId是用户ID,itemId是物品ID,score是预测的评分值。 完整代码如下: ```java DataModel model = new FileDataModel(new File("data/dataset.csv")); UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, similarity, model); Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); double score = recommender.estimatePreference(userId, itemId); ``` 需要注意的是,这里的数据集文件需要是CSV格式,每行数据格式为“userID,itemID,score”,需要根据实际情况修改。另外,这里的用户ID和物品ID需要是数字类型,如果是其他类型需要进行转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值