Love Lemon 2024-05-10 16:34 采纳率: 0%
浏览 2

基于物品协同过滤算法结果不准确


public static List<RecommendedItem> recommendItemCF(Integer userId,Integer goodId, Integer size) {
        List<RecommendedItem> recommendations = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            MysqlDataSource dataSource = new MysqlDataSource();
            dataSource.setServerName("localhost");//本地为localhost
            dataSource.setPort(3306);
            dataSource.setUser("root");
            dataSource.setPassword("123456");
            dataSource.setDatabaseName("car");//数据库名
            DataModel dataModel=new MySQLJDBCDataModel(dataSource,"comments","user_id","car_id","score","create_time");

            System.out.println("基于物品的协同过滤推荐算法开始计算...");

            //基于余弦相似性的相似度
            ItemSimilarity similarity = new UncenteredCosineSimilarity(dataModel);

            LongPrimitiveIterator iterator = dataModel.getItemIDs();
            while(iterator.hasNext()){
                long id = iterator.next();
                double sim = similarity.itemSimilarity(goodId, id);
                System.out.println("目标物品:"+goodId+" 与物品:"+id+" 相似度="+sim);
            }

            GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel,similarity); //推荐算法

            //获取推荐物品列表
            recommendations = recommender.recommendedBecause(userId,goodId,size);

            System.out.println("推荐结果:");
            //打印推荐的结果
            if(recommendations!=null) {
                for (RecommendedItem recommendedItem : recommendations) {
                    System.out.println("推荐物品:"+recommendedItem.getItemID()+",预测评分:"+recommendedItem.getValue());
                }
            }

            return recommendations;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

遇到的问题:这是Mahout的协同过滤算法,这个推荐的结果我不是很满意或者说不是预期的结果。
我插入了10个用户,10个物品,200条随机评分,然后新创一个用户新的评分,但是推荐的物品只有一个,还是我打分的那个。

img


这个图就是推荐结果,明明相似的结果挺多,但是经过推荐算法全部pass了,推荐出来的107、108都是我打分过的,按道理不是应该推荐我没打分过的相似物品吗,请问是哪一步出了问题。

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-10 16:34
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】: 您的目的是解决在使用Mahout库中的基于物品的协同过滤推荐算法时遇到的问题。具体来说,您发现算法的推荐结果不符合预期,即推荐的物品列表中只有一个物品,且该物品是您已经打分过的,而没有推荐您未打分的相似物品。

    【图片内容】: 您上传的图片显示了一系列物品与目标物品102的相似度评分,以及基于算法的推荐结果。推荐结果显示推荐了物品107和108,预测评分分别为9.825817和9.794092。

    【问题出现原因】: 问题可能出现的原因有:

    1. 推荐算法的逻辑可能没有正确实现,导致它没有推荐未打分的相似物品。
    2. 数据集可能不足以产生准确的推荐结果,尤其是如果只有少量用户和物品,且评分数据较少。
    3. 算法的参数设置可能不合适,比如size参数可能设置得过小,导致推荐结果数量有限。

    【问题解决方案】:

    1. 检查推荐算法的逻辑,确保它能够根据相似度评分推荐未打分的物品。
    2. 增加数据集的大小,提供更多的用户和物品评分数据,以提高推荐的准确性。
    3. 调整算法参数,比如增加size参数的值,以获取更多的推荐结果。
    4. 考虑使用其他推荐算法,比如基于用户的协同过滤或混合推荐系统,可能会提供更准确的结果。

    【提供代码】: 由于问题可能出在算法逻辑或参数设置上,以下是一些可能的代码调整建议:

    // 增加size参数的值以获取更多推荐结果
    Integer size = 10; // 根据需要调整这个值
    
    // 在推荐算法中排除用户已经评分的物品
    Set<Integer> ratedItems = new HashSet<>();
    // 假设ratedItems已经被填充了用户已经评分的物品ID
    recommendations = recommender.recommendedBecause(userId, goodId, size, ratedItems);
    

    【代码运行方式】: 运行修改后的代码需要以下环境:

    • Java开发环境
    • Mahout库
    • MySQL数据库(如果使用MySQLJDBCDataModel)

    运行方式:

    1. 将修改后的代码放入您的Java项目中。
    2. 确保所有依赖库都已正确导入。
    3. 在IDE中运行或使用构建工具(如Maven或Gradle)构建并运行。

    【代码预期运行结果】: 如果代码修改正确,您应该能够看到更多的推荐物品,且这些物品是用户未打分的,同时推荐的物品应该是基于相似度评分推荐的。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月10日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见