文档章节

GenericUserBasedRecommender推荐过程分析

cookqq
 cookqq
发布于 2014/03/11 11:57
字数 448
阅读 575
收藏 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
355
1
基于 Apache Mahout 构建社会化推荐引擎

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

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

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

cjun1990
2016/10/17
25
0

没有更多内容

加载失败,请刷新页面

加载更多

2018资本方向:重新发现社交

2018年可谓是资本寒冬,投资人方面认为今年投资主题较少,大量机构继续项目退出来筹措新一期基金,创业公司上市募资,好让投资人收回资金离场,在如此惨淡的背景下,社交领域的投资却有回暖趋...

ThinkSNS账号
15分钟前
1
0
day118-20181016-英语流利阅读-待学习

耶鲁毕业又如何?美国最高法院大法官被控性侵 雪梨 2018-10-16 1.今日导读 美国最高法院大法官布雷特·卡瓦诺(Brett Kavanaugh)被指涉及 1980 年代多件性侵案,包括克里斯汀·布莱希·福特...

飞鱼说编程
17分钟前
2
0
Android studio取消自动折叠代码

在这里面设置就行

lanyu96
17分钟前
1
0
Magento2后台忘记密码

Magento2后台忘记密码处理方式 第一种(Magento CLI 命令行创建新用户): php bin/magento admin:user:create --admin-user="newName" --admin-password="New-passwd" --admin-email="newN......

alt_tab_jj
18分钟前
1
0
Vue 引入Jquery jQueryRotate.2.2 制作转盘抽奖

原先用jquery做的,现在整合webpack+vue 其实只需要webpack就行了,只是为了方便打包。 1、关闭eslint 检测,如果开启,插件里面全是报错,麻烦的很。 webpack.base.conf.js const createLin...

大灰狼wow
19分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部