文档章节

GenericUserBasedRecommender推荐过程分析

cookqq
 cookqq
发布于 2014/03/11 11:57
字数 448
阅读 581
收藏 2

本人博客开始迁移,博客整个架构自己搭建及编码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)); 把主题增加到一个集合中.



















© 著作权归作者所有

共有 人打赏支持
cookqq

cookqq

粉丝 118
博文 268
码字总数 156096
作品 0
海淀
技术主管
私信 提问
Mahout各种推荐器主要特点

Mahout有很多推荐的实现,下面对各自特点进行介绍: 1、GenericUserBasedRecommender: 基于用户的推荐,用户数量相对较少时速度较快。 2、GenericItemBasedRecommender: 基于物品的推荐,物...

Candy_Desire
2014/10/30
0
0
Mahout各种推荐器的主要特点(转)

Mahout有很多推荐的实现,各有特点,在这里一并记录。 GenericUserBasedRecommender: 基于用户的推荐,用户数量相对较少时速度较快。 GenericItemBasedRecommender:基于物品的推荐,物品数...

liangtee
2012/12/23
0
0
mahout推荐系统实例运行

try { // 从文件加载数据 DataModel model = new FileDataModel(new File("intro.csv")); // 指定用户相似度计算方法,这里采用皮尔森相关度 UserSimilarity similarity = new PearsonCorre...

丶问道
2017/01/11
385
1
基于 Apache Mahout 构建社会化推荐引擎

Web 2.0 的一个核心思想就是“群体智慧”,即基于大众行为,为每个用户提供个性化的推荐。这使得如何让用户能更快速更准确的获得所需要的信息,成为了 Web 应用成败的关键。Apache Mahout 是...

红薯
2010/01/23
8.1K
4
使用eclipse+maven构建简单的mahout项目

搭建mahout的eclipse环境不难,新建一个maven的quick-start java项目,在pom导入一些mahout的依赖即可,具体过程参考:用Maven构建Mahout项目 想要好好理解清楚,需要好好的研究代码。例子中...

cjun1990
2016/10/17
25
0

没有更多内容

加载失败,请刷新页面

加载更多

fabric增删改查Mac

备份1.3版本,重新下载1.1版本到fabric文件夹 /opt/gopath/src/github.com/hyperledger/fabric -> /opt/gopath/src/github.com/hyperledger/fabric1.3 新建/opt/gopath/src/github.com/hype......

八戒八戒八戒
19分钟前
2
0
盘点愚人节各大网站彩蛋,谁最爱恶搞?

如今的愚人节俨然已是各品牌宣传了一个重要节日,同时,也成为了各大互联网科技企业凑热闹,比拼创意和策划的节日。跟小编一起看看有哪些有趣的策划吧! Google地图变成吃豆人游戏 每年愚人节...

临江仙卜算子
42分钟前
3
0
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍。Java8 用到了红黑树...

java菜分享
43分钟前
3
0
玩手机与做实验

看过这样一个故事:说的是在二十世纪二十年代初的一个深夜,担任英国剑桥大学卡文迪许实验室主任的卢瑟福来实验室检查,发现一位学生还在做实验。卢瑟福就问他:“你上午做什么了?”学生回答...

Bob2100
今天
5
0
Kafka流式处理

Kafka Streams 初识流式处理 什么是数据流 数据流(也叫事件流)是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新记录会不断加...

东都大狼狗
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部