推荐算法——基于用户的协同过滤算法(User-base CF)的java实现

  • 推荐系统
    • 什么是推荐系统
    • 为什么要有推荐系统
    • 推荐算法
  • 基于用户的协同过滤算法(User-base CF)
    • 算法介绍
    • 代码实现
  • 参考文档

推荐系统

什么是推荐系统

平时见过的推荐系统


为什么要有推荐系统

推荐系统的目的:

  1. 帮助用户找到想要的商品(新闻/音乐/……)
    帮用户找到想要的东西,谈何容易。商品茫茫多,甚至是我们自己,也经常点开淘宝,面对眼花缭乱的打折活动不知道要买啥。

  2. 降低信息过载
    互联网时代信息量已然处于爆炸状态,若是将所有内容都放在网站首页上用户是无从阅读的,信息的利用率将会十分低下。因此我们需要推荐系统来帮助用户过滤掉低价值的信息。

  3. 提高站点的点击率/转化率
    好的推荐系统能让用户更频繁地访问一个站点,并且总是能为用户找到他想要购买的商品或者阅读的内容。

  4. 加深对用户的了解,为用户提供定制化服务
    可以想见,每当系统成功推荐了一个用户感兴趣的内容后,我们对该用户的兴趣爱好等维度上的形象是越来越清晰的。当我们能够精确描绘出每个用户的形象之后,就可以为他们定制一系列服务,让拥有各种需求的用户都能在我们的平台上得到满足。

推荐算法

  • 基于流行度
    基于流行度的算法非常简单粗暴,类似于各大新闻、微博热榜等,根据PV、UV、日均PV或分享率等数据来按某种热度排序来推荐给用户。

  • 协同过滤算法
    协同过滤算法(Collaborative Filtering, CF)是很常用的一种算法,在很多电商网站上都有用到。CF算法包括基于用户的CF(User-based CF)和基于物品的CF(Item-based CF)。
    基于用户的CF原理如下:

    1. 分析各个用户对item的评价(通过浏览记录、购买记录等);

    2. 依据用户对item的评价计算得出所有用户之间的相似度;

    3. 选出与当前用户最相似的N个用户;

    4. 将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。
      示意图:

      基于物品的CF原理大同小异,只是主体在于物品:

    5. 分析各个用户对item的浏览记录。

    6. 依据浏览记录分析得出所有item之间的相似度;

    7. 对于当前用户评价高的item,找出与之相似度最高的N个item;

    8. 将这N个item推荐给用户。
      示意图:

  • 基于内容的算法

我们注册的时候经常看到这样的界面:
这个算法就是基于用户的兴趣和物品的tag进行选择的算法。

举个栗子,现在系统里有一个用户和一条新闻。通过分析用户的行为以及新闻的文本内容,我们提取出数个关键字,如下图:
将这些关键字作为属性,把用户和新闻分解成向量,如下图:
之后再计算向量距离,便可以得出该用户和新闻的相似度了。

  • 基于模型的算法
    基于模型的方法有很多,用到的诸如机器学习的方法也可以很深,比如Logistics回归预测等等

  • 混合算法
    现实应用中,其实很少有直接用某种算法来做推荐的系统。在一些大的网站如Netflix,就是融合了数十种算法的推荐系统。我们可以通过给不同算法的结果加权重来综合结果,或者是在不同的计算环节中运用不同的算法来混合,达到更贴合自己业务的目的。

基于用户的协同过滤算法(User-base CF)

算法介绍

User-based就是把与你有相同爱好的用户所喜欢的物品(并且你还没有评过分)推荐给你:

  • 算法过程:
  1. 找到相似度高的用户
  2. 根据1步骤获取的信息,推荐源用户相对喜欢,并且未采取过的行为
  • 计算用户相似度
    下面这个是大名鼎鼎的Jaccard公式,很简单, 取2个用户的选择集的交集,跟2个用户的选择集的并集,进行计算。但很显然,若要计算整个用户集合,时间复杂度是O(n^2),太慢了。


后续就有了利用倒排查表进行优化如下: 可以建立个5X5矩阵,以用户、行为为维度。

收藏 用户
1 1,2,3
2 2,3,5
3 1,3,5
4 3,4,5
5 2,3,4

下面这个公式可以完成之前提到的步骤二,p(u,i)-用户u对行为i的权重,S(u,k)表示和用户u相似的K个用户,N(i)表示采取过行为i的用户集合,W_uv表示用户u和用户v的相似度,R_vi表示用户v对行为i的权重。

代码实现

    public List<TopicView> RecommendTopic(Long uid){List<Long> userList;userList=userDao.getAllUserIDlist();Integer N=userList.size();
//        System.out.println("用户数量:"+N);Long[][] sparseMatrix=new Long[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】for(int i=0;i<N;i++){for(int j=0;j<N;j++)sparseMatrix[i][j]=(long)0;}Map<Long, Integer> userItemLength = new HashMap<>();//存储每一个用户对应的不同物品总数  eg: A 3Map<Long, Set<Long>> itemUserCollection = new HashMap<>();//建立物品到用户的倒排表 eg: a A BSet<Long> items = new HashSet<>();//辅助存储物品集合Map<Long, Integer> userID = new HashMap<>();//辅助存储每一个用户的用户ID映射:user->idMap<Integer, Long> idUser = new HashMap<>();//辅助存储每一个ID对应的用户映射:id->userfor(int i=0;i<N;i++){//依次处理N个用户Long user=userList.get((int)i);List<Long> itemlist=userTDao.getTopicIDlistByUserID(user);
//            System.out.println("UserID:"+user+" 收藏:"+itemlist);userItemLength.put(user,itemlist.size());//用户ID与稀疏矩阵建立对应关系userID.put(user,i);idUser.put(i,user);//建立物品--用户倒排表for(int j=0;j<itemlist.size();j++){Long topic=itemlist.get(j);if(items.contains(topic)){//如果已经包含对应的物品--用户映射,直接添加对应的用户itemUserCollection.get(topic).add(user);}else{//否则创建对应物品--用户集合映射items.add(topic);//创建物品--用户倒排关系itemUserCollection.put(topic,new HashSet<Long>());itemUserCollection.get(topic).add(user);}}}//输出倒排关系表
//        System.out.println("输出倒排关系表:\n"+itemUserCollection.toString());//计算相似度矩阵【稀疏】Set<Entry<Long, Set<Long>>> entrySet = itemUserCollection.entrySet();Iterator<Entry<Long, Set<Long>>> iterator = entrySet.iterator();while (iterator.hasNext()){Set<Long> commonUsers=iterator.next().getValue();for(Long user_u:commonUsers){for(Long user_v:commonUsers){if(user_u==user_v){continue;}//计算用户u与用户v都有正反馈的物品总数sparseMatrix[userID.get(user_u)][userID.get(user_v)]+=1;}}}//计算用户之间的相似度【余弦相似性】Integer recommendUserId = userID.get(uid);for(int j=0;j<sparseMatrix.length;j++){if(j!=recommendUserId){System.out.println(idUser.get(recommendUserId)+"--"+idUser.get(j)+"相似度:"+sparseMatrix[recommendUserId][j]/Math.sqrt(userItemLength.get(idUser.get(recommendUserId))*userItemLength.get(idUser.get(j))));}}//计算指定用户recommendUser的物品推荐度Map<Long,Double> itemRecommendDegree=new HashMap<>();//topic->推荐度for(Long item:items){//遍历每一件物品//得到购买当前物品的所有用户集合Set<Long> users=itemUserCollection.get(item);//如果被推荐用户没有购买当前物品,则进行推荐度计算if(!users.contains(uid)){double RecommendDegree = 0.0;for(Long user:users){//推荐度计算RecommendDegree+=sparseMatrix[userID.get(uid)][userID.get(user)]/Math.sqrt(userItemLength.get(uid)*userItemLength.get(user));}itemRecommendDegree.put(item,RecommendDegree);}}System.out.println("TopicID,推荐度\n"+itemRecommendDegree);//取最大的5个if(itemRecommendDegree.size()<5){List<Long> list = itemRecommendDegree.entrySet().stream().sorted((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())).map(entry -> entry.getKey()).collect(Collectors.toList()).subList(0, itemRecommendDegree.size());List<Long> list1=topicViewDao.findIDOrderByDate();for(int i=0;i<list1.size();i++){if(list.size()==5)break;if(list.contains(list1.get(i)))continue;list.add(list1.get(i));}System.out.println(list);return topicViewDao.findByTopicidIn(list);}else {List<Long> list = itemRecommendDegree.entrySet().stream().sorted((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())).map(entry -> entry.getKey()).collect(Collectors.toList()).subList(0, 5);System.out.println(list);return topicViewDao.findByTopicidIn(list);}}

参考文档

5类系统推荐算法,非常好使,非常全

协同过滤user-based CF算法与item-based CF算法对比

基于用户(user-based)的协同过滤推荐算法的初步理解以及代码实现

基于用户的协同过滤推荐算法java实现(UserCF)

推荐算法——基于用户的协同过滤算法(User-base CF)的java实现相关推荐

  1. 推荐算法概述(基于用户的协同过滤算法、基于物品的协同过滤算法、基于内容的推荐算法)

    "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程." 目前推 ...

  2. 推荐系统--基于用户的协同过滤算法

    1.         概述 和搜索引擎一样,推荐系统是为了帮助人们更快速的获得对自己有用的信息. 和搜索引擎不同,推荐系统是人们被动的获取,由系统根据用户行为或其他的信息推荐给用户的,儿搜索引擎是用户 ...

  3. python协同过滤电影推荐_python实现基于用户的协同过滤算法(CF)——以电影评价数据(ml-100k)为例...

    程序简介 项目以ml-100k电影评分数据集为输入,实现了基于用户的协同过滤算法,最后预测的MAE为0.84,因为经过优化,10万条评分数据运行时间不超过2分钟 协同过滤算法(CF)基于对用户历史行为 ...

  4. [推荐算法]UserCF,基于用户的协同过滤算法

    UserCF:UserCollaborationFilter,基于用户的协同过滤 算法核心思想:在一个在线推荐系统中,当用户A需要个性化推荐时,可以先找到和他有相似兴趣的其它用户,然后把那些用户喜欢的 ...

  5. 【推荐系统】基于用户的协同过滤算法

    基于用户的协同过滤算法 基础算法 在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的.而用户A没有听说过的物品推荐给A.这种方法称为基于 ...

  6. UserCF,基于用户的协同过滤算法

    转载自   UserCF,基于用户的协同过滤算法 UserCF:User  Collaboration   Filter,基于用户的协同过滤 算法核心思想:在一个在线推荐系统中,当用户A需要个性化推荐 ...

  7. 基于用户的协同过滤算法

    最近写搜索引擎文章写多了,来一篇之前写的老文,给那些对推荐算法感兴趣想入门的人吧,最近也在做推荐广告系统,又翻出来看了看. 什么是推荐算法 推荐算法最早在1992年就提出来了,但是火起来实际上是最近这 ...

  8. 基于用户的协同过滤算法详解

    0. 前言 基于领域的推荐算法是推荐系统中最基本的算法,此类算法不仅在学术界得到了深入研究,而且在工业界也得到了广泛地应用.基于领域的推荐算法主要分为两大类:一类是基于用户的协同过滤算法(User B ...

  9. 【推荐系统】{1} —— 基于用户的协同过滤算法

    协同过滤(英语:Collaborative Filtering,简称CF),简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人透过合作的机制给予信息相当程度的回应(如评分) ...

最新文章

  1. AI教父争夺秘史:百度2.88亿天价求才,因中国身份惜败谷歌
  2. Android 拦截WebView请求,并加入或修改参数(GET)
  3. SELECT COUNT语句
  4. 计算机知识应用,计算机知识应用基础复习大纲
  5. C\C++语言,从编程语言到库、API、框架、引擎
  6. 时间复杂度O(n^2)和O(nlog n)差距有多大?
  7. RSync服务器配置
  8. node mysql崩溃_Node出错导致运行崩溃的解决方案
  9. hp440g5拆机_HP 惠普 ProBook 440 G5 评测 | ZMMOO
  10. [海康威视]-门禁设备告警布防代码C#实现
  11. 深入浅出MFC笔记(5)
  12. 计算机青年教师基本功大赛,北京高校第九届青年教师基本功比赛纪实
  13. MySQL 运维 - 高阶SQL语句
  14. 国际贸易13种术语你都了解吗?
  15. 树莓派 交叉编译工具链的安装
  16. 字符串函数---atoi()函数详解及实现(完整版)
  17. Python画爱心——谁能拒绝用代码敲出来会跳动的爱心呢~
  18. 一些国内可用的高质量壁纸网站,免翻~
  19. 财经小知识:美国国债
  20. 【问题解决】win服务器磁盘初始化

热门文章

  1. 8、查询优化-关联查询优化-子查询优化-Order by 关键字优化-Group by 关键字优化-双路排序和单路排序
  2. 京东差评可以删除吗?京东100评价怎么显示?
  3. 用户中心:设置头像功能
  4. 浮点型的有效位和存储方式
  5. hashcode是什么?有什么作用?
  6. 《水浒传》读后(2) 鲁智深
  7. C#基础之数组排序,对象大小比较
  8. IP地址归属地查询接口
  9. 君正X2000开发板开箱测试
  10. a标签如何打开新窗口?