java 用户协同过滤算法_基于用户的协同过滤推荐算法java实现(UserCF)
UserCF的核心思想即为根据用户数据模拟向量相似度,我们根据这个相似度,来找出指定用户的相似用户,然后将相似用户买过的而指定用户没有买的东西推荐给指定用户,推荐度的计算也是结合了相似用户与指定用户的相似度累加。注意这里我们默认是用户的隐反馈行为,所以每一个物品的影响因子默认为1。
package cn.csu.CFUtils;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
/**
* 基于用户的协同过滤推荐算法实现
A a b d
B a c
C b e
D c d e
* @author Administrator
*
*/
public class UserCF {
public static void main(String[] args) {
/**
* 输入用户-->物品条目 一个用户对应多个物品
* 用户ID物品ID集合
* Aa b d
* Ba c
* Cb e
* Dc d e
*/
Scanner scanner = new Scanner(System.in);
System.out.println("Input the total users number:");
//输入用户总量
int N = scanner.nextInt();
int[][] sparseMatrix = new int[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】
Map userItemLength = new HashMap<>();//存储每一个用户对应的不同物品总数 eg: A 3
Map> itemUserCollection = new HashMap<>();//建立物品到用户的倒排表 eg: a A B
Set items = new HashSet<>();//辅助存储物品集合
Map userID = new HashMap<>();//辅助存储每一个用户的用户ID映射
Map idUser = new HashMap<>();//辅助存储每一个ID对应的用户映射
System.out.println("Input user--items maping infermation:");
scanner.nextLine();
for(int i = 0; i < N ; i++){//依次处理N个用户 输入数据 以空格间隔
String[] user_item = scanner.nextLine().split(" ");
int length = user_item.length;
userItemLength.put(user_item[0], length-1);//eg: A 3
userID.put(user_item[0], i);//用户ID与稀疏矩阵建立对应关系
idUser.put(i, user_item[0]);
//建立物品--用户倒排表
for(int j = 1; j < length; j ++){
if(items.contains(user_item[j])){//如果已经包含对应的物品--用户映射,直接添加对应的用户
itemUserCollection.get(user_item[j]).add(user_item[0]);
}else{//否则创建对应物品--用户集合映射
items.add(user_item[j]);
itemUserCollection.put(user_item[j], new HashSet());//创建物品--用户倒排关系
itemUserCollection.get(user_item[j]).add(user_item[0]);
}
}
}
System.out.println(itemUserCollection.toString());
//计算相似度矩阵【稀疏】
Set>> entrySet = itemUserCollection.entrySet();
Iterator>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Set commonUsers = iterator.next().getValue();
for (String user_u : commonUsers) {
for (String user_v : commonUsers) {
if(user_u.equals(user_v)){
continue;
}
sparseMatrix[userID.get(user_u)][userID.get(user_v)] += 1;//计算用户u与用户v都有正反馈的物品总数
}
}
}
System.out.println(userItemLength.toString());
System.out.println("Input the user for recommendation:");
String recommendUser = scanner.nextLine();
System.out.println(userID.get(recommendUser));
//计算用户之间的相似度【余弦相似性】
int recommendUserId = userID.get(recommendUser);
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的物品推荐度
for(String item: items){//遍历每一件物品
Set users = itemUserCollection.get(item);//得到购买当前物品的所有用户集合
if(!users.contains(recommendUser)){//如果被推荐用户没有购买当前物品,则进行推荐度计算
double itemRecommendDegree = 0.0;
for(String user: users){
itemRecommendDegree += sparseMatrix[userID.get(recommendUser)][userID.get(user)]/Math.sqrt(userItemLength.get(recommendUser)*userItemLength.get(user));//推荐度计算
}
System.out.println("The item "+item+" for "+recommendUser +"'s recommended degree:"+itemRecommendDegree);
}
}
scanner.close();
}
}
java 用户协同过滤算法_基于用户的协同过滤推荐算法java实现(UserCF)相关推荐
- 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法
详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法 TF-IDF的基本原理 算法思想 计算公式 相似度计算原理 微型图书推荐案例 案例背景 开发工具 数据预处理 TF-IDF模型建 ...
- 协同过滤算法_基于用户的协同过滤推荐算法原理和实现
(给算法爱好者加星标,修炼编程内功) 来源:Create Chen's Blog https://www.cnblogs.com/technology/p/4467895.html 在推荐系统众多方法 ...
- 协同过滤算法_基于Mahout的协同过滤推荐算法
1协同过滤 基于物品的协同过滤 对物品进行相似度计算,然后再进行推荐. 基于用户的协同过滤 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢,并对这些喜好进行度量和打分.根据不 ...
- JAVA电子通讯录项目报告_基于jsp的通讯录-JavaEE实现通讯录 - java项目源码
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的通讯录, 该项目可用各类java课程设计大作业中, 通讯录的系统架构分为前后台两部分, 最终实现在线上进行通讯录各 ...
- 病虫害模型算法_基于深度学习的目标检测算法综述
sigai 基于深度学习的目标检测算法综述 导言 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像 ...
- python 排列组合算法_基于python快速实现排列组合算法
1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库#_*_ coding:utf-8 _*_ #__author__= ...
- c++多边形扫描线填充算法_基于MATLAB的道格拉斯普克算法递归实现
道格拉斯普克算法 (道格拉斯-普克)Douglas-Peukcer算法由D.Douglas和T.Peueker于1973年提出,是线状要素抽稀的经典算法.用它处理大量冗余的几何数据点,既可以达到数据量 ...
- Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发
Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...
- 在线新闻推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法、机器学习、分布式大数据、人工智
在线新闻推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法.机器学习.分布式大数据.人工智 ...
最新文章
- centos安装emqtt_benchmark
- 如何拓展外链引流,让网站成为“顶牛”?
- 过渡期间的测试:外包软件的测试标准(译)
- librosa能量_librosa与python_speech_features
- 485转换器产品类型介绍
- 创造型模式——单例模式
- 无限循环小数四则运算_狐狸笔记 | 0.999999无限循环下去,就等于1吗?
- 使用WMS海外仓储系统可以改变仓储管理的哪些方面?
- 过来人的亲身经验告诉你,如何从菜鸟晋升月薪过万的测试工程师
- 主进程退出后子进程还会存在吗?_[docker]从一个实例,一窥docker进程管理
- HTML期末网页设计——设计报告
- Error Based Injection和sql注入函数
- 抽象工厂模式---游戏等级
- SkipList(跳跃表)详解
- 有华为的HCIP证书会更好找工作吗?
- android手机解锁成功后的广播,Android动态注册锁屏、解锁、开屏系统广播
- STP协议 与 STP树的生成
- RK3399学习笔记 1.0.3---python环境 Firefly Core-3399pro-jd4 Win10上RKNN工具安装
- IIS 使用 office365 SMTP relay
- JS实现线条动态背景
热门文章
- Mapper文件中不等号的写法
- style=text css,cssText-cssText 是什么,style.cssText 使用教程
- java生成图片大小_Java 对图片进行大小转换
- 古墓丽影8:地下世界主题包
- python numpy 基础教程
- 【ClickHouse系列】ClickHouse之zk目录结构说明
- 制作U盘多系统(老毛桃WinPE,Ubuntu,MaxDOS,CDlinux,Parted Magic Linux)引导工具
- 装饰模式(大话设计模式例子C++实现)
- 怎么看电脑哪个应用使用流量最高?
- iOS 8系统正式版升级指南及功能详解