From b4173c240be14017de6ae7587ccbd42453ad48e6 Mon Sep 17 00:00:00 2001 From: tarzan Date: Thu, 2 Feb 2023 16:24:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tarzan/recommend/core/CoreMath.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/tarzan/recommend/core/CoreMath.java b/src/main/java/com/tarzan/recommend/core/CoreMath.java index a669df2..a63c42f 100644 --- a/src/main/java/com/tarzan/recommend/core/CoreMath.java +++ b/src/main/java/com/tarzan/recommend/core/CoreMath.java @@ -29,23 +29,19 @@ public class CoreMath { //按用户分组 Map> userMap=list.stream().collect(Collectors.groupingBy(RelateDTO::getUseId)); //获取其他用户与当前用户的关系值 - Map distances = computeNeighbor(userId, userMap); + Map userDisMap = computeNeighbor(userId, userMap); + //获取关系最近的用户 + double maxvalue=Collections.max(userDisMap.values()); + Set userIds=userDisMap.entrySet().stream().filter(e->e.getValue()==maxvalue).map(Map.Entry::getKey).collect(Collectors.toSet()); //取关系最近的用户 - Integer nearestUserId = distances.values().iterator().next(); + Integer nearestUserId = userIds.stream().findAny().get(); //最近邻用户看过电影列表 List neighborItems = userMap.get(nearestUserId).stream().map(RelateDTO::getModuleId).collect(Collectors.toList()); //指定用户看过电影列表 List userItems = userMap.get(userId).stream().map(RelateDTO::getModuleId).collect(Collectors.toList()); - - //找到最近邻看过,但是该用户没看过的电影,计算推荐,放入推荐列表 - List recommendList = new ArrayList<>(); - for (Integer item : neighborItems) { - if (!userItems.contains(item)) { - recommendList.add(item); - } - } - // Collections.sort(recommendList); - return recommendList; + //找到最近邻看过,但是该用户没看过的电影 + neighborItems.removeAll(userItems); + return neighborItems; } @@ -53,20 +49,22 @@ public class CoreMath { * 在给定userId的情况下,计算其他用户和它的相关系数并排序 * @param userId 用户id * @param userMap 用户电影评分关系mqp - * @return Map + * @return Map */ - private Map computeNeighbor(Integer userId, Map> userMap) { - Map distances = new TreeMap<>(); + private Map computeNeighbor(Integer userId, Map> userMap) { + Map userDisMap = new TreeMap<>(); List userItems=userMap.get(userId); userMap.forEach((k,v)->{ //排除此用户 if(!k.equals(userId)){ + //关系系数 + double coefficient = pearsonDis(v,userItems); //关系距离 - double distance = pearsonDis(v,userItems); - distances.put(distance, k); + double distance=Math.abs(coefficient); + userDisMap.put(k,distance); } }); - return distances; + return userDisMap; } @@ -102,6 +100,9 @@ public class CoreMath { */ public static double getRelate(List xs, List ys){ int n=xs.size(); + if (n==0) { + return 0D; + } double Ex= xs.stream().mapToDouble(x->x).sum(); double Ey=ys.stream().mapToDouble(y->y).sum(); double Ex2=xs.stream().mapToDouble(x->Math.pow(x,2)).sum();