博主介绍:本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;

🍅希望对大家有帮助🍅

基础算法信息

public class CollaborativeFiltering {

    // 计算两个用户之间的余弦相似度
    public static double cosineSimilarity(Map<Integer, Double> user1Ratings, Map<Integer, Double> user2Ratings) {
        double dotProduct = 0;
        double magnitudeUser1 = 0;
        double magnitudeUser2 = 0;

        // 找出两个用户都评分过的物品
        for (Integer itemId : user1Ratings.keySet()) {
            if (user2Ratings.containsKey(itemId)) {
                double rating1 = user1Ratings.get(itemId);
                double rating2 = user2Ratings.get(itemId);
                dotProduct += rating1 * rating2;
                magnitudeUser1 += rating1 * rating1;
                magnitudeUser2 += rating2 * rating2;
            }
        }

        magnitudeUser1 = Math.sqrt(magnitudeUser1);
        magnitudeUser2 = Math.sqrt(magnitudeUser2);

        if (magnitudeUser1 == 0 || magnitudeUser2 == 0) {
            return 0;
        }

        return dotProduct / (magnitudeUser1 * magnitudeUser2);
    }


    // 找到与给定用户最相似的K个用户(邻居)
    public static List<Integer> findNearestNeighbors(int targetUserId, Map<Integer, Map<Integer, Double>> userItemRatings, int k) {
        Map<Integer, Double> targetUserRatings = userItemRatings.get(targetUserId);
        List<Integer> neighborIds = new ArrayList<>();
        Map<Integer, Double> similarityScores = new HashMap<>();

        // 计算目标用户与其他所有用户的相似度
        for (Integer userId : userItemRatings.keySet()) {
            if (!userId.equals(targetUserId)) {
                Map<Integer, Double> otherUserRatings = userItemRatings.get(userId);
                double similarity = cosineSimilarity(targetUserRatings, otherUserRatings);
                similarityScores.put(userId, similarity);
            }
        }

        // 按照相似度从高到低排序,选取前K个用户作为邻居
        similarityScores.entrySet().stream()
                .sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
                .limit(k)
                .forEach(entry -> neighborIds.add(entry.getKey()));

        return neighborIds;
    }


    // 基于邻居的评分对目标用户进行物品推荐
    public static List<Integer> recommendItems(int targetUserId, Map<Integer, Map<Integer, Double>> userItemRatings, int k, int numRecommendations) {
        List<Integer> neighborIds = findNearestNeighbors(targetUserId, userItemRatings, k);
        Map<Integer, Double> itemScores = new HashMap<>();

        // 计算每个物品的推荐得分(基于邻居的评分加权平均等方式,这里简单示例)
        for (Integer neighborId : neighborIds) {
            Map<Integer, Double> neighborRatings = userItemRatings.get(neighborId);
            for (Integer itemId : neighborRatings.keySet()) {
                if (!userItemRatings.get(targetUserId).containsKey(itemId)) {
                    double score = itemScores.getOrDefault(itemId, 0.0);
                    score += neighborRatings.get(itemId);
                    itemScores.put(itemId, score);
                }
            }
        }

        // 按照推荐得分从高到低排序,选取前numRecommendations个物品作为推荐结果
        List<Integer> recommendedItems = new ArrayList<>();
        itemScores.entrySet().stream()
                .sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
                .limit(numRecommendations)
                .forEach(entry -> recommendedItems.add(entry.getKey()));

        return recommendedItems;
    }

}

项目使用

@RequestMapping("listLookMsg")
public void listLookMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {


    //先根据用户字段对数据库查询的数据进行分类
    QueryWrapper<LookMsg> queryWrapper = new QueryWrapper<LookMsg>();
    queryWrapper.groupBy("msg_user_id");
    List<LookMsg> listData = lookMsgMapper.selectList(queryWrapper);


  // 模拟用户对数据,外层Map的键是用户ID,内层Map的键是推荐的信息ID,值是随机信息
    Map<Integer, Map<Integer, Double>> userItemRatings = new HashMap<>();
    for (int i = 0; i < listData.size(); i++) {

        
        //通过用户的iD获取某个用户浏览过的商品信息
        QueryWrapper<LookMsg> lookWrapper = new QueryWrapper<LookMsg>();
        lookWrapper.eq("msg_user_id",listData.get(i).getMsgUserId());
        List<LookMsg> listLook = lookMsgMapper.selectList(lookWrapper);
        
        //把获取的商品信息插入到map集合里面去
        Map<Integer, Double> userRatings  = new HashMap<Integer, Double>();;
        for (int a = 0; a< listLook.size();a++) {
            userRatings.put(listLook.get(a).getMsgId(),Double.valueOf(listLook.get(a).getMsgId()));
        }
        userItemRatings.put(listData.get(i).getMsgUserId(),userRatings);
    }

    int targetUserId = 1;
    int k = 10;  // 选取的邻居数量
    int numRecommendations = 10;  // 推荐物品数量

    List<Integer> recommendedItems = recommendItems(targetUserId, userItemRatings, k, numRecommendations);
    System.out.println("推荐给用户 " + targetUserId + " 的信息是: " + recommendedItems);


    List<LookMsg> listResult = new ArrayList<LookMsg>();
    for (int i= 0;i<recommendedItems.size();i++){
        QueryWrapper<LookMsg> lookWrapper = new QueryWrapper<LookMsg>();
        lookWrapper.eq("msg_id",recommendedItems.get(i));
        listResult.add(lookMsgMapper.selectList(lookWrapper).get(0));
    }

    JSONObject jsonmsg = new JSONObject();
    jsonmsg.put("repMsg", "ok");
    jsonmsg.put("repCode", "666");
    jsonmsg.put("data", gsonTools.createGsonString(listResult));
    response.getWriter().print(jsonmsg);// 将路径返回给客户端
    System.out.println(jsonmsg);

}

谢谢浏览

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐