【推荐算法】协同过滤算法——基于用户 Java实现
只是简单谢了一个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实现相关推荐
- 计算机系统应用的书,基于个性化图书推荐的协同过滤算法
摘 要本文对基于个性化图书推荐的协同过滤算法的设计方案进行实验,目的是为证实在真实用户的多标准评估过程中怎样产生数据集,从而找到一种科学的算法.并通过图书推荐的应用案例来说明算法,以验证其是否有效. ...
- 推荐系统 --- 推荐算法 --- 基于用户行为的推荐算法 - 协同过滤算法
概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...
- 推荐系统之基于邻域的算法-------协同过滤算法
基于邻域的协同过滤主要分为两类,基于用户的协同过滤和基于物品的协同过滤.前者给用户推荐和他兴趣相似的其他用户喜欢的物品,后者则是推荐和他之前喜欢过的物品相似的物品. 基于用户的协同过滤算法 这里介绍基 ...
- 协同过滤:基于用户的协同过滤itemCF
基于用户的协同过滤算法也被称为最近邻协同过滤或KNN (K.Nearest-Neighbor,K最近邻算法).其核心思想就是,首先根据相似度计算出目标用户的邻居集合,然后用邻居用户评分的加权组合来为目 ...
- 机器学习算法--协同过滤算法
0. 关键词 推荐算法 长尾理论 UserCF ItemCF 1. 推荐算法 互联网的飞速发展使我们进入了信息过载的时代,搜索引擎可以帮助我们查找内容,但只能解决明确的需求.为了让用户从海量信息中高效 ...
- 推荐机制 协同过滤和基于内容推荐的区别
基于人口统计学的推荐 基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后 ...
- 协同过滤系统基于用户的评分预测
推荐算法–协同过滤 什么是协同过滤 协同过滤推荐(Collaborative Filtering recommendation)是在信息过滤和信息系 统中正迅速成为一项很受欢迎的技术.与传统的基于内容 ...
- 推荐系统算法—协同过滤算法详解
文章目录 基于用户的协同过滤(UserCF) 基本思想 例子 UserCF 改进 基于物品的协同过滤(ItemCF) 基本思想 例子 ItemCF 改进 归一化 UserCF 与 ItemCF 对比 ...
- 推荐系统-通过数据挖掘算法协同过滤讨论基于内容和用户的区别
概念 个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品. 为什么要个性化推荐? 商品个数和种类快速增长,顾客需要花费大量的时间才能找到自己想买的商品 浏览大量无关的信息和产品 ...
- 推荐算法——基于用户的协同过滤算法(User-base CF)的java实现
推荐算法--基于用户的协同过滤算法(User-base CF)的java实现 推荐系统 什么是推荐系统 为什么要有推荐系统 推荐算法 基于用户的协同过滤算法(User-base CF) 算法介绍 代码 ...
最新文章
- python中forward的参数_如何将关键字参数传递给preforward钩子使用的forward?
- WINCE5 s3c2440_SD驱动知识补充
- 自律到极致-人生才精致「第5期」:领奖通知
- php中一定要写 吗,PHP编程一定要改掉的5个不良习惯
- Web service 超过了最大请求长度错误解决
- 01-09 Linux三剑客-sed
- android8按键布局,机身按键接口布局合理_手机Android频道-中关村在线
- 音频杂音问题_OBS直播出现杂音或者电流声、没声音或者调大音量等操作
- R语言自定义设置使用内存的大小、可以使用的内存范围?
- web切图怎么做_Web前端切图快捷键、技巧和经验
- 软考软件设计师下午真题-面向对象的程序设计与实现-组合设计模式(2021年上半年试题六))Java代码讲解
- redis集群和redis宕机处理方案
- Jmeter查看QPS和响应时间随着时间的变化曲线
- linux , Shell 文件合并的命令
- 建设一个SaaS平台需要知道什么,做什么
- word论文格式管理和孤行控制
- ibm服务器日志文件提取,IBM服务器日志搜集方法
- Android 添加微信分享三种实现方案
- PHP小说源码+自动采集
- Linux命令教程第一期