云夜OVO 2024-03-07 09:05 采纳率: 70%
浏览 19

基于用户的协同过滤推荐算法java实现报错

使用springboot实现基于用户的协同过滤推荐算法时,在计算用户相似度的函数中采用余弦相似度计算公式,但是运行时报错,代码如下:

//采用余弦相似度计算公式计算两个用户的相似度
    public Double calculateSimilarity(List<Map<Integer, Double>> list1, List<Map<Integer, Double>> list2){//计算用户相似度
        double dotProduct = 0.0;
        double modList1 = 0.0;
        double modList2 = 0.0;

        for (int i = 0; i < list1.size(); i++) {
            Map<Integer, Double> map1 = list1.get(i);
            Map<Integer, Double> map2 = list2.get(i);
            for (Integer key: map1.keySet()) {
                if (map2.containsKey(key)) {
                    dotProduct += map1.get(key) * map2.get(key);
                }
                modList1 += Math.pow(map1.get(key), 2);
                modList2 += Math.pow(map2.get(key), 2);
            }
        }

        modList1 = Math.sqrt(modList1);
        modList2 = Math.sqrt(modList2);

        if (modList1 == 0 || modList2 == 0) {
            return 0.0;
        }

        return dotProduct / (modList1 * modList2);
    }

报错如下:

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
    at com.example.utils.CollaborativeFiltering.calculateSimilarity(CollaborativeFiltering.java:21)
    at com.example.controller.RecommendController.getSimilarity(RecommendController.java:39)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:261)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:189)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:917)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:829)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:1583)

  • 写回答

5条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-03-07 09:14
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述:在使用Spring Boot实现基于用户的协同过滤推荐算法时,采用了余弦相似度计算公式,在计算用户相似度的函数中,代码如下:
    public Double calculateSimilarity(List<Map<Integer, Double>> list1, List<Map<Integer, Double>> list2){
       double dotProduct = 0.0;
       double modList1 = 0.0;
       double modList2 = 0.0;
       for (int i = 0; i < list1.size(); i++) {
          Map<Integer, Double> map1 = list1.get(i);
          Map<Integer, Double> map2 = list2.get(i);
          for (Integer key: map1.keySet()) {
             if (map2.containsKey(key)) {
                dotProduct += map1.get(key) * map2.get(key);
             }
             modList1 += Math.pow(map1.get(key), 2);
             modList2 += Math.pow(map2.get(key), 2);
          }
       }
       modList1 = Math.sqrt(modList1);
       modList2 = Math.sqrt(modList2);
       if (modList1 == 0 || modList2 == 0) {
          return 0.0;
       }
       return dotProduct / (modList1 * modList2);
    }
    

    但是在运行时报错:

    java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer
    

    该错误提示类转换错误,将字符串转换为整数时出错。 解决方案:该错误通常发生在类型不匹配的情况下。在查看代码后发现,在计算用户相似度函数中,使用了Integer类型的键,但在实际使用时却传入了字符串类型的键,导致类型转换错误。 针对这个问题,可以使用Integer.parseInt()将字符串类型的键转换为整数类型,代码如下:

    public Double calculateSimilarity(List<Map<String, Double>> list1, List<Map<String, Double>> list2){
        double dotProduct = 0.0;
        double modList1 = 0.0;
        double modList2 = 0.0;
        for (int i = 0; i < list1.size(); i++) {
            Map<String, Double> map1 = list1.get(i);
            Map<String, Double> map2 = list2.get(i);
            for (String key: map1.keySet()) {
                if (map2.containsKey(key)) {
                    dotProduct += map1.get(key) * map2.get(key);
                }
                modList1 += Math.pow(map1.get(key), 2);
                modList2 += Math.pow(map2.get(key), 2);
            }
        }
        modList1 = Math.sqrt(modList1);
        modList2 = Math.sqrt(modList2);
        if (modList1 == 0 || modList2 == 0) {
            return 0.0;
        }
        return dotProduct / (modList1 * modList2);
    }
    

    通过将键的类型改为字符串类型,并使用Integer.parseInt()将字符串类型的键转换为整数类型,解决了类型转换错误的问题。 示例代码如下:

    List<Map<String, Double>> list1 = new ArrayList<>();
    List<Map<String, Double>> list2 = new ArrayList<>();
    // 在list1和list2中添加数据
    Double similarity = calculateSimilarity(list1, list2);
    System.out.println("用户相似度:" + similarity);
    

    该示例代码可以用来计算两个用户的相似度,其中list1和list2中分别存储了两个用户的评分数据,calculateSimilarity()函数返回了两个用户之间的相似度,可以将其用于推荐算法中的用户相似度计算。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月7日