1.什么是协同过滤
协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。
2.推荐过程
创建4个用户,每个用户4个商品
建立物品-用户的对应关系
此时查询张三
张三与用户:李四相似度:0.4082482904638631
张三与用户:王五相似度:0.4082482904638631
张三与用户:麻六相似度:0.3333333333333333
为张三推荐
用户张三,为您推荐广告创意推荐度为:0.8164965809277261
用户张三,为您推荐英语竞赛推荐度为:0.3333333333333333
用户张三,为您推荐公益大赛推荐度为:0.3333333333333333
算法实现代码
import java.util.*;
import java.util.Map.Entry;
/**
* 基于用户的协同过滤推荐算法实现
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) {
ACf cF1 = new ACf();
cF1.setUserId(201704113113L);
cF1.setProductName("设计大赛,编程大赛,数学竞赛");
ACf cF2 = new ACf();
cF2.setUserId(201704113114L);
cF2.setProductName("设计大赛,广告创意");
ACf cF3 = new ACf();
cF3.setUserId(201704113115L);
cF3.setProductName("数学竞赛,广告创意");
ACf cF4 = new ACf();
cF4.setUserId(201704113116L);
cF4.setProductName("公益大赛,数学竞赛,英语竞赛");
List<ACf> acfList =new ArrayList<>();
acfList.add(cF1);
acfList.add(cF2);
acfList.add(cF3);
acfList.add(cF4);
String filtering = filtering(201704113113L, acfList);
}
/**
* ACF实体类
* 编号
* private Long id;
* 用户编号
* private Long userId;
* 已购商品
* private String productName;
*
* 输入用户-->物品条目 一个用户对应多个物品
* 用户ID 物品ID集合
* cfs.get(0):ACf.getUserId=1 ACf.getProductName="计算机大赛,数学竞赛,WWE大赛,算法大赛"
* cfs.get(1):ACf.getUserId=2 ACf.getProductName="计算机大赛,数学竞赛,WWE大赛,算法大赛"
* cfs.get(2):ACf.getUserId=3 ACf.getProductName="计算机大赛,数学竞赛,WWE大赛,算法大赛"
* @param userId 当前登录用户
* @param cfs List集合
* @return
*/
public static String filtering(Long userId,List<ACf> cfs){
//根据集合长度创建二维数组
int[][] sparseMatrix = new int[cfs.size()][cfs.size()];
//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】
Map<String, Integer> userItemLength = new HashMap<>();
//存储每一个用户对应的不同物品总数 eg: A 3
Map<String, Set<String>> itemUserCollection = new HashMap<>();
//建立物品到用户的倒排表 eg: a A B
Set<String> items = new HashSet<>();
//辅助存储物品集合
Map<String, Integer> userID = new HashMap<>();
//辅助存储每一个用户的用户ID映射
Map<Integer, String> idUser = new HashMap<>();
//辅助存储每一个ID对应的用户映射
for (int i = 0; i < cfs.size() ; i++){
//循环历史物品a,b,c 以","间隔
String[] user_item = cfs.get(i).getProductName().split(",");
//当前用户id
String user = cfs.get(i).getUserId().toString();
//物品长度
int length = user_item.length;
//key存放user用户id length存放物品数量
userItemLength.put(user, length);
//key存放user用户id value存放当前用户下标
userID.put(user, i);
//用户ID与稀疏矩阵建立对应关系
idUser.put(i, user);
//建立物品--用户倒排表
for (int j = 0; j < length; j ++){
if(items.contains(user_item[j])){
//如果已经包含对应的物品--用户映射,直接添加对应的用户
itemUserCollection.get(user_item[j]).add(user);
} else{
//否则创建对应物品--用户集合映射
items.add(user_item[j]);
itemUserCollection.put(user_item[j], new HashSet<String>());
//创建物品--用户倒排关系
itemUserCollection.get(user_item[j]).add(user);
}
}
}
System.out.println("itemUserCollection:"+itemUserCollection.toString());
//下面是核心代码,收费,需要可以联系。