推荐列表是已经看过的电影啊?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Yerik老师 2025-02-25 10:06:57

这种设计可以用于展示用户的观看历史或基于用户的兴趣进行更复杂的推荐逻辑(例如,推荐与已观看电影相似但未观看的电影)。


如果你想推荐用户尚未观看的电影,可以调整现有逻辑,并在此基础上进行扩展和优化。


拓展和优化建议:


基于上述建议的代码调整示例:


public class RecommendationSystem {

    Map<Integer, List<Integer>> userMoviesMap;

    Map<Integer, Float> userRatingsMap; // 新增:用户对电影的评分映射


    public RecommendationSystem(){

        this.userMoviesMap = new HashMap<>();

        this.userRatingsMap = new HashMap<>();

    }


    // 记录用户观看电影并评分

    public void recordMovieWatching(User user, int movieId, float rating) {

        if (!userMoviesMap.containsKey(user.id)) {

            userMoviesMap.put(user.id, new ArrayList<>());

        }

        if (!userRatingsMap.containsKey(movieId)) {

            userRatingsMap.put(movieId, rating);

        }

        userMoviesMap.get(user.id).add(movieId);

    }


    // 推荐未观看且可能感兴趣的电影

    public List<Movie> recommendedMovies(User user) {

        List<Movie> recommendedMovies = new ArrayList<>();

        List<Integer> watchedMovies = userMoviesMap.getOrDefault(user.id, new ArrayList<>());


        // 简化版:基于相似用户喜欢但目标用户尚未观看的电影进行推荐

        User similarUser = findMostSimilarUser(user);

        if (similarUser != null && userMoviesMap.containsKey(similarUser.id)) {

            for (int movieId : userMoviesMap.get(similarUser.id)) {

                if (!watchedMovies.contains(movieId)) {

                    Movie movie = getMovieDetails(movieId);

                    recommendedMovies.add(movie);

                }

            }

        }


        // 根据评分排序推荐电影

        recommendedMovies.sort((m1, m2) -> 

            Float.compare(userRatingsMap.getOrDefault(m2.id, 0f), userRatingsMap.getOrDefault(m1.id, 0f))

        );


        return recommendedMovies;

    }


    //其他省略

}


  • 关键代码一点也不写吗? 如何查找相似用户?

    2025-09-19 16:46:29
  • 我们今天这个案例,叫做 “最小可运行推荐系统原型”。它的目的不是实现一个完整的推荐算法,而是展示推荐系统的整体结构和数据流动逻辑。

    你可以把它理解为一个“骨架工程”——就像医生学解剖,先看骨骼系统,再学肌肉、神经、循环系统。

    为什么推荐了“看过的电影”?

    这是为了先确保核心链路打通:

    用户行为记录 → 数据存储 → 查询 → 输出推荐列表。

    这条链路通了,后续的算法才能往上挂。

    这在工业开发中叫做 “打桩测试(Mock Implementation)”:先用简单逻辑验证流程正确性,再替换为真实算法。

    那“相似用户”怎么找?代码没写?

    注意,findMostSimilarUser(user) 这个方法虽然目前是“空方法”,但它是一个标准的扩展接口,它的实现可以是:

    基于用户观影集合的 Jaccard 相似度;

    基于评分向量的 余弦相似度;

    甚至未来可以接入 Embedding 向量匹配。

    比如,一个简化的相似用户查找逻辑可以是:

    private User findMostSimilarUser(User targetUser) {

        List<Integer> targetMovies = userMoviesMap.getOrDefault(targetUser.id, new ArrayList<>());

        User bestMatch = null;

        double bestScore = -1;


        for (Integer userId : userMoviesMap.keySet()) {

            if (userId == targetUser.id) continue;

            List<Integer> otherMovies = userMoviesMap.get(userId);

            double similarity = jaccardSimilarity(targetMovies, otherMovies);

            if (similarity > bestScore) {

                bestScore = similarity;

                bestMatch = new User(userId); // 简化表示

            }

        }

        return bestMatch;

    }


    private double jaccardSimilarity(List<Integer> a, List<Integer> b) {

        if (a.isEmpty() && b.isEmpty()) return 0;

        List<Integer> union = new ArrayList<>(a);

        List<Integer> intersection = new ArrayList<>(a);

        union.addAll(b);

        intersection.retainAll(b);

        return (double) intersection.size() / union.size();

    }

    但这些复杂算法不是本节课的重点。

    我们这节课的重点是:

    如何用 Map 组织用户行为数据

    如何设计可扩展的推荐接口

    如何构建“记录-查询-推荐”的完整闭环

    算法细节会在后续“推荐算法专题”中深入讲解。

    所以,总结一下:

    当前代码不是“推荐系统”的终点,而是起点;

    不是“算法缺失”,而是“分阶段教学”;

    那些没写的代码,正是你接下来要学习的内容。

    ——这,就是我们课程的设计逻辑。


    2025-09-19 20:56:45
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法大师之路
  • 参与学习       67    人

Java从业者AI时代高薪必学科目,基础到AI人工智能-逐层递进,构建坚实全面的算法知识体系。前沿的知识系统+丰富的实战案例+就业晋升指导+资深专业服务团队,快速抢占制高点,成为AI时代抢手人才。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师