Ohh868 2024-05-12 21:33 采纳率: 0%
浏览 4

推荐算法写好之后,发现相似度推荐全部是0.0,不知道是哪里的问题

推荐算法我加进去了,但是不知道哪里的问题,我的算法分析用户相似度时,分析结果就是当前用户和其他用户的相似度都是0.0,根本推不出来。
我觉得第一种可能是计算相似度代码错了,但不知道是不是?我打断点之后,发现disMap是0.0错了,但是userItems和List都是能得到且信息正确
以下是我的代码:

public class CoreMath {
    /**
     * 计算相关系数并排序
     */
    public static Map<Integer, Double> computeNeighbor(Integer key, Map<Integer, List<Associate>> map, int type) {
        Map<Integer, Double> distMap = new TreeMap<>();
        List<Associate> userItems = map.get(key);
        if (CollectionUtil.isNotEmpty(userItems)) {
            map.forEach((k, v) -> {
                //排除此用户
                if (!k.equals(key)) {
                    //关系系数
                    double coefficient = relateDist(v, userItems, type);
                    //关系距离
                    double distance = Math.abs(coefficient);
                    distMap.put(k, distance);
                }
            });
        }
        return distMap;
    }


    /**
     * 计算两个序列间的相关系数
     */
    private static double relateDist(List<Associate> xList, List<Associate> yList, int type) {
        List<Integer> xs = new ArrayList<>();
        List<Integer> ys = new ArrayList<>();
        xList.forEach(x -> yList.forEach(y -> {
            if (type == 0) {
                if (x.getNotebookId().equals(y.getNotebookId())) {
                    xs.add(x.getIndex());
                    ys.add(y.getIndex());
                }
            } else {
                if (x.getUserId().equals(y.getUserId())) {
                    xs.add(x.getIndex());
                    ys.add(y.getIndex());
                }
            }
        }));
        return getRelate(xs, ys);
    }

    /**
     * 方法描述: 皮尔森相关系数计算
     * @param xs x集合
     * @param ys y集合
     * @Return {@link double}
     */
    public static double getRelate(List<Integer> xs, List<Integer> ys) {
        int n = xs.size();
        //至少有两个元素
        if (n < 2) {
            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();
        double Ey2 = ys.stream().mapToDouble(y -> Math.pow(y, 2)).sum();
        double Exy = IntStream.range(0, n).m

第二种可能是我的业务代码,收集加权后用户物品关系数据错了,我发现data里面只能存储当前用户的第一组index>1的数据,就没有数据了。
以下是我的代码:

// 定义一个存储每个笔记和每个用户关系的List
        List<Associate> data = new ArrayList<>();
//        计算每篇笔记和每个用户之间的关系指数
        for (Notebook notebook : allNotebook) {
            int index = 1;//遍历笔记
            Integer notebookId = notebook.getId();
            for (User user : allUsers) {//遍历用户
                Integer userId = user.getId();
               //指数设置为1
                // 1. 判断该用户有没有收藏该商品,收藏的权重:3
                Optional<Collect> collectOptional = allCollects.stream().filter(x -> x.getFid().equals(notebookId) && x.getUserId().equals(userId)).findFirst();
                if (collectOptional.isPresent()) {
                    index += 3;
                }
                // 2. 判断该用户有没有点赞该商品,点赞权重: 1
                Optional<Likes> cartOptional = allLikes.stream().filter(x -> x.getFid().equals(notebookId) && x.getUserId().equals(userId)).findFirst();
                if (cartOptional.isPresent()) {
                    index += 1;
                }
                // 3. 判断该用户有没有评论过笔记,评论的权重: 1
                Optional<Comment> commentOptional = allComments.stream().filter(x -> x.getFid().equals(notebookId) && x.getUserId().equals(userId)).findFirst();
                if (commentOptional.isPresent()) {
                    index += 1;
                }
                if (index > 1) {
                    Associate associate = new Associate(userId,notebookId,index);
                    data.add(associate);
                }
            }

        }

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-12 21:33
    关注

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


    【您想要解决的问题】:您的问题是要解决推荐算法中用户相似度计算不正确的问题,具体表现为计算出的相似度全部为0.0,导致无法进行有效的推荐。

    【问题出现原因】:

    1. 计算相似度的代码可能存在逻辑错误,导致无法正确计算出用户之间的相似度。
    2. 业务代码中收集用户与物品关系数据的方式可能存在问题,导致数据收集不完整或不正确。

    【问题解决方案】:

    1. 检查relateDist方法中的逻辑,特别是循环的使用,确保正确地比较了所有用户之间的相似度。
    2. 检查getRelate方法中的皮尔森相关系数计算逻辑,确保计算过程正确无误。
    3. 检查业务代码中的数据收集逻辑,确保能够正确地收集到所有用户与物品之间的关系数据。

    【提供代码】: 由于代码片段不完整,无法提供完整的解决方案代码。但是,以下是一些可能的改进点:

    • 确保relateDist方法中的内嵌循环正确地遍历了所有需要比较的用户和物品。
    • getRelate方法中,完成皮尔森相关系数的计算,包括计算方差和协方差。
    • 在业务代码中,检查data列表的构建逻辑,确保所有相关的用户-物品对都被正确地添加到列表中。

    【代码运行方式】: 您需要将修改后的代码集成到您的Java项目中,并确保所有依赖项都已正确配置。然后,您可以在IDE中运行项目,或者使用构建工具(如Maven或Gradle)构建并运行。

    【代码预期运行结果】: 预期结果是,修改后的代码能够正确计算出用户之间的相似度,并且相似度值不再是全部为0.0。这样,推荐算法就能够根据这些相似度值为用户推荐相关的物品。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月12日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂