基于springboot的商城购物的用户协同推荐算法源码
技术选型:springboot vue(elementui)
真实场景:一个用户在网上买了一个手机,那么接下来又买了一个手机壳
另一个用户买了一个手机,那么他接下来想买什么呢
这里只是简单举拿2个用户举例
x用户浏览 a,b,c商品
y用户浏览 a,b商品
那么给y用户推荐c商品
具体代码实践
//用户总量 int[][] sparseMatrix = new int[memberList.size()][memberList.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对应的用户映射 System.out.println("Input user--items maping infermation:<eg:A a b d>"); for (int i = 0; i < memberList.size() ; i++){ //依次处理N个用户 数据 以空格间隔 List<HistoryEntity> historyList = historyDao.queryByUserId(memberList.get(i).getId()); int length = historyList.size(); userItemLength.put(String.valueOf(memberList.get(i).getId()), length); //eg: A 3 userID.put(String.valueOf(memberList.get(i).getId()), i); //用户ID与稀疏矩阵建立对应关系 idUser.put(i, String.valueOf(memberList.get(i).getId())); //建立物品--用户倒排表 for (int j = 0; j < length; j ++){ if(items.contains(String.valueOf(historyList.get(j).getGoodsId()))){ //如果已经包含对应的物品--用户映射,直接添加对应的用户 itemUserCollection.get(String.valueOf(historyList.get(j).getGoodsId())).add(String.valueOf(memberList.get(i).getId())); } else{ //否则创建对应物品--用户集合映射 items.add(String.valueOf(historyList.get(j).getGoodsId())); itemUserCollection.put(String.valueOf(historyList.get(j).getGoodsId()), new HashSet<String>()); //创建物品--用户倒排关系 itemUserCollection.get(String.valueOf(historyList.get(j).getGoodsId())).add(String.valueOf(memberList.get(i).getId())); } } } System.out.println(itemUserCollection.toString()); System.out.println("1---------------------"); //计算相似度矩阵【稀疏】 Set<Entry<String, Set<String>>> entrySet = itemUserCollection.entrySet(); Iterator<Entry<String, Set<String>>> iterator = entrySet.iterator(); while(iterator.hasNext()){ Set<String> 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:<eg:A>"); String recommendUser = String.valueOf(userId); 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)))); } }