/*** 此方法使用协同过滤算法,大概意思就是从数据库拿到所有的用户收藏和当前的用户收藏作为比对,找出和当前用户收藏夹最接近的一个用户,* 然后将那个用户的收藏中当前登录用户没有的展示给当前用户* @param model* @param request* @return*/
/*
举例说明一下,比如当前登录userid = 1
用户关联表中数据,
用户1关联歌曲{2,3}(当前登录用户收藏的歌曲)
用户2关联歌曲{2,3,4}
用户3关联歌曲{3,4,5}
用户4关联歌曲{1,5}
*/
@RequestMapping(value = "/getRecommendList", method = RequestMethod.GET)
public String getRecommendList(Model model, HttpServletRequest request) {// 协同过滤算法HttpSession httpSession = request.getSession();String name = httpSession.getAttribute("name").toString();// 获取userIdint orginal = userService.getUserByName(name).getId(); //对应模拟数据,这个值为1// 获取所有用户和歌曲的关联List<Enshrine> all = enshrineService.getAll();//刚才所有的模拟数据 第一个enshrine对象值为userid=1,movieid=2,第二个userid=1,movieid=2 。。。 这个集合的长度=所有用户收藏的歌曲的长度,所以说all集合的长度为10// 创建用户推荐map,数据结构为 key:Integer 对应用户id value:List 对应一个广告的id集合HashMap<Integer, List<Integer>> userRecommend = new HashMap();// 遍历所有的关联/*第1次循环 userid=1,movieid=2第2次循环 userid=1,movieid=3第3次循环 userid=2,movieid=2第4次循环 userid=2,movieid=3第5次循环 userid=2,movieid=4第6次循环 userid=3,movieid=3第7次循环 userid=3,movieid=4第8次循环 userid=3,movieid=5第9次循环 userid=4,movieid=1第10次循环 userid=4,movieid=5这个再看不懂的话,o(∩_∩)o **/for (int i = 0; i < all.size(); i++) {// 获取每一个用户和歌曲Idint userId = all.get(i).getUser_id(); //第一次循环 userId=1int movieid = all.get(i).getMovie_id(); // 第一次循环 movie_id=2// 如果推荐map中有以当前用户为Key的数据if (userRecommend.containsKey(userId)) { //第一次循环,这个map是新建的,肯定都是Null,所以userRecommend肯定没有以当前用户id作为key的值// 根据用户id获取map对应的valueList<Integer> recommendTemp = userRecommend.get(userId);// 在拿到的集合中添加新的歌曲idrecommendTemp.add(movie_id);// 更新此key valueuserRecommend.put(userId, recommendTemp);} else {// 如果不包含,新建一个集合,然后将Key value放入mapList<Integer> recommendTemp = new ArrayList<>();  //没有值就新建一个ListrecommendTemp.add(movie_id);                     // 添加当前循环的这个movieid,这个集合的数据就是 [2]userRecommend.put(userId, recommendTemp);         // 将当前循环的userid作为key,集合作为value放入userRecommend中,此时map中的值为{1,[2]}}}/**每次循环userRecommend的值的变化{{1,[2]}}{{1,[2,3]}}{{1,[2,3]},{2,[2]}}{{1,[2,3]},{2,[2,3]}}{{1,[2,3]},{2,[2,3,4]}}{{1,[2,3]},{2,[2,3,4]},{3,[3]}}{{1,[2,3]},{2,[2,3,4]},{3,[3,4]}}{{1,[2,3]},{2,[2,3,4]},{3,[3,4,5]}}{{1,[2,3]},{2,[2,3,4]},{3,[3,4,5]},{4,[1]}}{{1,[2,3]},{2,[2,3,4]},{3,[3,4,5]},{4,[1,5]}} 最终形态*///注意如果当前登录用户没有收藏过任何歌曲,这个map中就不会有以当前登录用户为key的value了// 新建我的歌单List<Integer> myRecommend = new ArrayList<>();// 如果刚才存放的map中包含有以当前登录用户id为key的数据if (userRecommend.containsKey(orginal)) { // 则我的歌单 = 从歌单列表中获取的集合myRecommend = userRecommend.get(orginal);// System.out.println("orginal: " + orginal);// System.out.println("mySize: " + myRecommend.size());} else {myRecommend = new ArrayList<>();}/*从map中取出刚才存入的当前用户的歌单myRecommend = [2,3]如果用户没有收藏任何的歌曲myRecommend = []当前的模拟数据是有歌曲的,所以是第一个*/// 将我的歌单列表集合转换为set集合HashSet<Integer> myRecommendSet = new HashSet<Integer>(myRecommend);double maxValue = 0;int maxId = -1;// 遍历推荐列表中所有点key/*这个keySet()方法,相当于将userRecommend所有Key拿出来放入一个集合中数据结构就是[1,2,3,4]*//*循环[1,2,3,4]第一次循环 key=1循环的是当前用户的id,所以跳过这次循环第二次 key=2从userRecommend拿到所有的歌曲集合拿到了[2,3,4]和我的歌曲集合myRecommend=[2,3]做对比取交集获取新集合 intersection = [2,3]创建一个新集合union放入我的歌曲集合union = [2,3]把当前循环用户的歌曲集合放入union,因为是set集合会去掉重复的元素所以 union=[2,3,4]用intersection此时的长度2/union此时的长度3 得到一个ratio小数 可以将它看作为67% ratio=0.67此时maxValue的值为0,0.67 > 0所以设置maxValue的值为0.67maxId = 当前循环的用户id = 2第三次 key=3从userRecommend拿到所有的歌曲集合拿到了[3,4,5]和我的歌曲集合myRecommend=[2,3]做对比取交集获取新集合 intersection = [3]创建一个新集合union放入我的歌曲集合union = [2,3]把当前循环用户的歌曲集合放入union,因为是set集合会去掉重复的元素所以 union=[2,3,4,5]用intersection此时的长度1/union此时的长度4 得到一个ratio小数  ratio=0.25此时maxValue的值为0.67,0.25 < 0.67所以maxValue的值不变 = 0.67maxId不变 = 2第四次 key=4从userRecommend拿到所有的歌曲集合拿到了[1,5]和我的歌曲集合myRecommend=[2,3]做对比取交集获取新集合 intersection = []创建一个新集合union放入我的歌曲集合union = [2,3]把当前循环用户的歌曲集合放入union,因为是set集合会去掉重复的元素所以 union=[2,3]用intersection此时的长度0/union此时的长度2 得到一个ratio小数 ratio=0此时maxValue的值为0.67,0 < 0.67所以maxValue的值不变 = 0.67maxId不变 = 2*/for (int key : userRecommend.keySet()) {// 当遍历到当前用户Id为key的时候,跳过此次循环,开始下一次循环if (key == orginal) {continue;}// 根据当前循环到的key获取value,也就是对应此用户歌曲的集合List<Integer> thisRecommend = userRecommend.get(key);// System.out.println("thisSize: " + thisRecommend.size());// 将当前歌曲的集合转换为setHashSet<Integer> thisRecommendSet = new HashSet<>(thisRecommend);// 将我的歌曲集合转换为setHashSet<Integer> intersection = new HashSet<>(myRecommendSet);// 取交集 我的歌曲会剩下两个集合中都有的歌曲idintersection.retainAll(thisRecommendSet);HashSet<Integer> union = new HashSet<>(myRecommendSet);// System.out.println("union1: " + union.size());// 将两个人收藏的所有歌曲去重并放入此集合中union.addAll(thisRecommendSet);// System.out.println("union2: " + union.size());// 如果取过交集的集合为空,说明当前循环到的用户和当前登录的用户没有收藏同一种歌曲,跳过此次循环,开始下一次循环if (union.size() == 0) {continue;} else {// 如果不为空,则用我的歌曲列表/交集集合double ratio = (double) intersection.size() / union.size();if (ratio > maxValue) {// 最大值就位两者之比maxValue = ratio;// maxId = 当前循环的用户maxId = key;}}}// 创建歌曲推荐列表List<Integer> MovieRecommendList = new ArrayList<>();// 如果maxID没有被更改过,则为当前登录用户IDif (maxId == -1) { //此时maxId = 2maxId = orginal;} else {// 如果被更改过,就从推荐列表中取出key为maxId(maxId为拥有最大交集的用户id) 的歌曲列表,HashSet<Integer> differenceTemp = new HashSet<>(userRecommend.get(maxId)); // differenceTemp = [2,3,4]// maxId用户歌单列表中的歌曲 - 我的歌单列表中的歌曲 = 我没有的歌曲differenceTemp.removeAll(myRecommendSet); // differenceTemp = [4] 所以,在推荐列表中就会出现id为4的歌曲,剩下的就是计算相似度和将歌曲传到前台了!MovieRecommendList = new ArrayList<Integer>(differenceTemp); }// 一下代码就是从我没有的歌曲列表id中取得歌曲信息List<Advertisement> movies = new ArrayList<>();for (int i = 0; i < MovieRecommendList.size(); i++) {Advertisement movie = advertisementService.getMovieById(MovieRecommendList.get(i));movies.add(movie);}model.addAttribute("professor", movies);
//      System.out.println(movies.size());DecimalFormat df=new DecimalFormat("0.00");// 歌单相似度 = 我的歌单长度/(我的歌单长度 + 我没有的歌曲长度) * 100%String similar = "歌单相似度:"+df.format((float)myRecommendSet.size()/(myRecommendSet.size()+movies.size())*100)+"%";System.out.println(similar);model.addAttribute("similar", similar);return "recommend";
}

音乐推荐系统协同过滤算法解释相关推荐

  1. 推荐系统-协同过滤算法简介简化版实例

    必须先忏悔一下太久没记录学习轨迹,最近感觉脑子里一团浆糊,搞得自己非常难受,自信心也是被严重摧毁.训斥自己必须要保持记录的习惯,因为这不仅是对知识的整理,更让你知道其实你知道的很多! 因为刚结束了一个 ...

  2. 推荐系统----协同过滤算法原理及实现

    一.基本介绍 1. 推荐系统任务 推荐系统的任务就是联系用户和信息一方面帮助用户发现对自己有价值的信息,而另一方面让信息能够展现在对它感兴趣的用户面前从而实现信息消费者和信息生产者的双赢. 2. 与搜 ...

  3. 推荐系统协同过滤算法——矩阵分解模型

    文章目录 一.简介 1.推荐系统的输入 1)显式反馈 2)隐式反馈 2.重点内容 3.关联用户与物品的两种CF技术 1)基于邻域的方法 2)隐语义模型 隐语义空间: 4.内容总结 二.预备知识 符号 ...

  4. java基于springboot+vue协同过滤算法的音乐推荐系统

    音乐是人类永恒的话题,无论是在古代还是现代人们对音乐都有一种非常的热爱在里面,同时音乐也寄语了人们对美好事物的憧憬,很多时候人们在试听音乐的时候并不能够及时的找到适合自己的音乐,而且当下很多音乐都是收 ...

  5. 在线音乐推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化音乐推荐系统 音乐网站+协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    在线音乐推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化音乐推荐系统 音乐网站+协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 MusicRec ...

  6. [机器学习] 推荐系统之协同过滤算法(转)

    [机器学习]推荐系统之协同过滤算法 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.本文将带你深入了解协同过滤的秘密.下面直接进入正题. 1. 什么是推荐算法 推荐算法最 ...

  7. “泰迪杯”挑战赛 - 基于用户协同过滤算法的电影推荐系统(附算法代码)

    目录 第 1 章 绪论 1.1.研究背景 1.2.国际发展形势第 2 章 基于用户协同过滤推荐技术 第 2 章 基于用户协同过滤推荐技术 2.1 电子商务推荐系统概述 2.2 协同过滤推荐技术 第 3 ...

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

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

  9. 基于协同过滤算法的在线鲜花店推荐系统详解及GitHub下载

    [[TOC]] 基于协同过滤的在线鲜花店推荐系统 项目需求: 基于店铺的客户订单记录,实现店铺的推荐需求: 基于RFM模型,得到客户的价值分类,对高价值客户进行重点跟踪,推荐其潜在的商品列表,即实现: ...

  10. springboot采用协同过滤算法的视频推荐系统的设计与实现毕业设计源码261620

    摘  要 现阶段,社会的发展和科技的进步,以及大数据时代下纷繁数据信息的融合,使得人们在生产及生活过程中,都将会接收到各种类型的数据信息,而通过计算机技术与网络技术,则能够将众多人们所不了解或不常用的 ...

最新文章

  1. RedHat之yum解决办法
  2. BMP图片魔法师KeyGen
  3. 【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(一)
  4. isinstance函数
  5. 导出EXCEL遇到问题
  6. MYSQL 5.7 解压版 windows 环境下安装
  7. java线程跟多线程
  8. Anaconda+tensorflow+keras的下载与安装
  9. FreeBSD下MongoDB数据库的安装
  10. [USACO13OPEN]Luxury River Cruise【模拟】
  11. iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画
  12. 及时搜索工具下载地址 listary
  13. 矩阵分析与应用(5)
  14. UE4蓝图教程(1)
  15. 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
  16. 异常-银行账户异常处理
  17. shader实现飞线效果(three.js练习)
  18. python的socket
  19. Pycharm2018.2永久破解
  20. stm32f103c8t6c语言教程,STM32f103C8T6入门学习记录.doc

热门文章

  1. 什么是网络操作系统?网络操作系统具有那些基本功能?
  2. 仿qq局域网聊天软件 c++ 非mfc 数据库
  3. wpf 复制到粘贴板_将WPF UI单元复制到剪贴板-阿里云开发者社区
  4. 2015-4-26分享的PDF
  5. 已删除的QQ好友聊天记录怎么查看
  6. 二元logistic模型案例_二元Logistic模型(上)
  7. 计算机快速录入,如何快速把书中的文字扫描并录入电脑
  8. 某条微博评论数据爬取
  9. 这样投递简历更容易找到工作
  10. 处理Windows快捷键占用冲突