只是简单谢了一个Demo,先贴上GitHub地址。
https://github.com/wang135139/recommend-system

基本概念就不过多介绍了,相信能看明白的都了解。如果想了解相关推荐先做好知识储备:
1.什么事推荐算法
2.什么是基于邻域的推荐算法

笔者选用的是GroupLens的MoviesLens数据
传送门GroupLens

数据集处理

此处截取数据 UserId + MovieId 作为隐反馈数据。个人的实现方式并不是很好,之后再考虑优化,如果有好的想法欢迎小纸条。
基本设置项目结构如下:

/project
        /analyzer --推荐分析-CollaborativeFileringanalyzer
        /bean --数据元组-BasicBean
            -HabitsBean
        /input --输入设置-ReaderFormat
        /recommender --推荐功能-UserRecommender

首先思路是截取MovieLens数据,转化为格式化的书籍格式。MovieLens数据基本格式为

| user id | item id | rating | timestamp |

读取后的数据为表结构,实际可以用 Map 或者 二维数组 进行存储。
考虑到之后转化的问题,决定用二维数组。

设置BasicBean用于存储表结构中的行,主要设置List < String >用于存储一行数据中的单项数据

    /*** A row of data sets describes in witch the parameters are included.* * @author wqd * 2016/01/18*/public class BasicBean {private List<String> parameters;//  private int num;private boolean tableHead;///Default constructor,the row set n floders and is or not a table headpublic BasicBean(boolean head) {parameters = new ArrayList<String>();this.tableHead = head;}//Default constructor,the row set table head and how much the row //set is defined by the variable parameters,it isn't a table headpublic BasicBean(String... strings) {this(false, strings);}//Default constructor,the row set table head and how much the row //set is defined by the variable parameters and is or not a table headpublic BasicBean(boolean head, String... strings) {parameters = new ArrayList<String>();for(String string : strings) {parameters.add(string);}//      this.num = parameters.size();this.tableHead = head;}public int add(String param) {parameters.add(param);return this.getSize();}//replace a parameter value pointed to a new value//If success,return true.If not,return false.public boolean set(int index, String param) {if(index < this.getSize())parameters.set(index, param);elsereturn false;return true;}//Get the head.If it has table head,return ture.//If not,return flase;public boolean isHead() {return tableHead;}//Override toString()public String toString() {StringBuilder str = new StringBuilder(" ");int len = 1;for (String string : parameters) {str.append("\t|" + string);if(len++ % 20 == 0)str.append("\n");}return str.toString();}//Get number of parameterspublic int getSize() {return parameters.size();}//Get arraypublic List<String> getArray() {return this.parameters;}//Get ID of a setpublic int getId() {return this.getInt(0);}public String getString(int index) {return parameters.get(index);}public int getInt(int index) {return Integer.valueOf(parameters.get(index));}public boolean getBoolean(int index) {return Boolean.valueOf(parameters.get(index));}public float getFloat(int index) {return Float.valueOf(parameters.get(index));}}

在原数据读取之后,数据处理的话效率还是比较差,冗余字段比较多,因为一个用户会对多个电影反馈数据。因此,将
| user id | item id | rating | timestamp |
=>
| user id | item id 1 | item id 2 | item id 3 | item id 4 …

这边设置HabitsBean用于存储,单独将id进行抽取,直接存储在Bean中。实际在list中,存储user item ids,原因是在之后进行操作时,ID操作频繁。

public class HabitsBean extends BasicBean {private int id ;//get the IDpublic int getId() {return id;}//set the IDpublic void setId(int id) {this.id = id;}public HabitsBean() {this(-1);}//default id is -1,it means the id hadn't been evaluatedpublic HabitsBean(int id) {this.id = id;}//Override Object toString() methodpublic String toString() {StringBuilder str = new StringBuilder("HabitBean " + this.id + " :");str.append(super.toString());return str.toString();}}

将元组数据读取之后,再将元组数据进行压缩重组,转化为方便与处理的数据格式。设置ReaderFormat进行处理,Demo如下:

/*** This class for reading training and test files.It can * be suitable for Grouplens and other data sets.* @author wqd**/
public class ReaderFormat {List<BasicBean> lists;List<HabitsBean> formLists;public List<BasicBean> read (String filePath) throws IOException {@SuppressWarnings("resource")BufferedReader in = new BufferedReader(new FileReader(filePath));String s;BasicBean basicBean = null;lists = new ArrayList<BasicBean>();while((s = in.readLine()) != null) {
//          System.out.println(s);String[] params = s.split("\t");//          for (String string : params) {
//              System.out.println(string);
//          }basicBean = new BasicBean(params);lists.add(basicBean);}return lists;}//combine user log like | userID | habitID | ...//to userID and | habitID1 | habitID2 | habitID3 | ...//sort the userIDpublic List<HabitsBean> formateLogUser(String filePath) throws IOException {lists = this.read(filePath);formLists = new LinkedList<HabitsBean>();HabitsBean row = null;for (BasicBean basicBean : lists) {if(basicBean.) {row = new HabitsBean(1);row.setId(basicBean.getInt(0));row.add(basicBean.getString(1));formLists.add(row);} else {this.addBinarySerch(formLists, basicBean);}}return formLists;}//binary serchprivate void addBinarySerch(List<HabitsBean> lists, BasicBean bean) {int start = 0;int end = lists.size()-1;int pointer = (start + end + 1) / 2;HabitsBean row = lists.get(pointer);while(start <= end) {if(row.getId() == bean.getId()) {row.add(bean.getString(1));lists.set(pointer, row);return ;} else if(start == end) {break;}else if(row.getId() > bean.getId()) {end = pointer;} else if(row.getId() < bean.getId()) {start = pointer;}pointer = (start + end + 1) / 2;row = lists.get(pointer);}HabitsBean newBean = new HabitsBean(bean.getId());newBean.add(bean.getString(1));lists.add(newBean);return ;}// testpublic static void main(String[] args) {ReaderFormat readerFormat = new ReaderFormat();try {List<HabitsBean> lists = readerFormat.formateLogUser("E:/WorkSpace/Input/ml-100k/u1.base");for (HabitsBean habitsBean : lists) {System.out.println(habitsBean.toString());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

推荐算法

协同过滤算法的核心思想是根据用户间的相似度,来进行推荐。
N(u),N(v)表示u,v用户有过隐性反馈的集合,Jaccard公式

或者采用余弦相似度

转载于:https://www.cnblogs.com/cunchen/p/9464156.html

【推荐算法】协同过滤算法——基于用户 Java实现相关推荐

  1. 计算机系统应用的书,基于个性化图书推荐的协同过滤算法

    摘 要本文对基于个性化图书推荐的协同过滤算法的设计方案进行实验,目的是为证实在真实用户的多标准评估过程中怎样产生数据集,从而找到一种科学的算法.并通过图书推荐的应用案例来说明算法,以验证其是否有效. ...

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

    概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...

  3. 推荐系统之基于邻域的算法-------协同过滤算法

    基于邻域的协同过滤主要分为两类,基于用户的协同过滤和基于物品的协同过滤.前者给用户推荐和他兴趣相似的其他用户喜欢的物品,后者则是推荐和他之前喜欢过的物品相似的物品. 基于用户的协同过滤算法 这里介绍基 ...

  4. 协同过滤:基于用户的协同过滤itemCF

    基于用户的协同过滤算法也被称为最近邻协同过滤或KNN (K.Nearest-Neighbor,K最近邻算法).其核心思想就是,首先根据相似度计算出目标用户的邻居集合,然后用邻居用户评分的加权组合来为目 ...

  5. 机器学习算法--协同过滤算法

    0. 关键词 推荐算法 长尾理论 UserCF ItemCF 1. 推荐算法 互联网的飞速发展使我们进入了信息过载的时代,搜索引擎可以帮助我们查找内容,但只能解决明确的需求.为了让用户从海量信息中高效 ...

  6. 推荐机制 协同过滤和基于内容推荐的区别

    基于人口统计学的推荐 基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后 ...

  7. 协同过滤系统基于用户的评分预测

    推荐算法–协同过滤 什么是协同过滤 协同过滤推荐(Collaborative Filtering recommendation)是在信息过滤和信息系 统中正迅速成为一项很受欢迎的技术.与传统的基于内容 ...

  8. 推荐系统算法—协同过滤算法详解

    文章目录 基于用户的协同过滤(UserCF) 基本思想 例子 UserCF 改进 基于物品的协同过滤(ItemCF) 基本思想 例子 ItemCF 改进 归一化 UserCF 与 ItemCF 对比 ...

  9. 推荐系统-通过数据挖掘算法协同过滤讨论基于内容和用户的区别

    概念 个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品. 为什么要个性化推荐? 商品个数和种类快速增长,顾客需要花费大量的时间才能找到自己想买的商品 浏览大量无关的信息和产品 ...

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

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

最新文章

  1. python中forward的参数_如何将关键字参数传递给preforward钩子使用的forward?
  2. WINCE5 s3c2440_SD驱动知识补充
  3. 自律到极致-人生才精致「第5期」:领奖通知
  4. php中一定要写 吗,PHP编程一定要改掉的5个不良习惯
  5. Web service 超过了最大请求长度错误解决
  6. 01-09 Linux三剑客-sed
  7. android8按键布局,机身按键接口布局合理_手机Android频道-中关村在线
  8. 音频杂音问题_OBS直播出现杂音或者电流声、没声音或者调大音量等操作
  9. R语言自定义设置使用内存的大小、可以使用的内存范围?
  10. web切图怎么做_Web前端切图快捷键、技巧和经验
  11. 软考软件设计师下午真题-面向对象的程序设计与实现-组合设计模式(2021年上半年试题六))Java代码讲解
  12. redis集群和redis宕机处理方案
  13. Jmeter查看QPS和响应时间随着时间的变化曲线
  14. linux , Shell 文件合并的命令
  15. 建设一个SaaS平台需要知道什么,做什么
  16. word论文格式管理和孤行控制
  17. ibm服务器日志文件提取,IBM服务器日志搜集方法
  18. Android 添加微信分享三种实现方案
  19. PHP小说源码+自动采集
  20. Linux命令教程第一期

热门文章

  1. microsoft mysql下载_MySQL下载与安装+Jmeter
  2. tuxedo管理命令之tmadmin
  3. mysql 优化 - like模糊查询优化
  4. linux部署tomcat8(基于centOS7)
  5. 奇异值分解与低秩矩阵近似
  6. 【upstream】Nginx配置upstream实现负载均衡
  7. 《剑指offer》-统计整数二进制表示中1的个数
  8. Mac 下配置XAMPP
  9. 品运维自动化之cobbler的安装序
  10. 虚拟桌面之往事如风 --读书篇