如何:数组中余弦相似度的平方根 ~java~

我的问题是,我正在创建一个图书推荐系统,当我尝试对平方进行平方根以确定相似性时。我不相信它是每个数组的所有内容的平方根。


系统会向用户提示二十本书,然后根据他们喜欢这本书的程度输入“1-5”范围内的答案,如果他们还没有读过这本书,则输入“-1”。


我的一些分数输出是 NaN。因此我假设它只是在数组的第一个元素之后停止。


我尝试过重新排列循环,我个人认为这是循环及其访问数组的方式的问题。


这是 CPU 评级文件。


-1 1 1 4 1 3 3 1 2 3 4 -1 4 1 2 4 5 4 2 3

3 -1 2 3 -1 2 5 -1 3 3 5 2 2 1 2 3 5 3 4 2

-1 1 -1 4 1 3 5 2 1 5 3 -1 5 2 1 3 4 5 3 2

-1 -1 3 2 -1 5 5 2 2 4 4 2 3 2 -1 3 4 4 3 1

2 1 1 5 2 2 4 2 3 4 3 -1 5 2 2 5 3 5 2 1

3 -1 3 4 -1 2 5 -1 -1 4 3 -1 3 -1 2 5 5 5 4 2

4 -1 4 2 3 -1 1 3 4 -1 1 4 4 4 -1 2 -1 1 4 4

4 3 3 3 -1 2 2 4 3 -1 2 4 3 4 2 -1 -1 2 2 3

3 -1 3 -1 3 4 -1 5 5 -1 -1 -1 1 -1 -1 1 1 2 -1 5

3 -1 3 4 3 4 -1 5 5 2 3 3 4 1 1 -1 -1 -1 -1 4

4 -1 4 4 1 3 -1 5 4 -1 1 3 4 1 -1 1 -1 1 -1 5

5 -1 3 1 4 3 -1 5 4 1 3 2 1 -1 4 2 1 -1 2 4

3 -1 5 1 4 4 2 5 5 1 2 3 1 1 -1 1 -1 1 -1 5

4 1 5 4 3 -1 1 3 4 -1 -1 3 3 -1 1 1 2 -1 3 5

-1 1 1 3 -1 3 1 3 -1 -1 3 -1 5 2 2 1 4 -1 5 -1

3 -1 2 3 1 5 4 3 3 -1 5 -1 5 2 -1 4 4 3 3 3

1 1 1 3 2 4 1 -1 -1 -1 5 -1 3 -1 -1 1 -1 2 5 2

-1 2 3 5 -1 4 3 1 1 3 3 -1 4 -1 -1 4 3 2 5 1

-1 1 3 3 -1 3 3 1 -1 -1 3 -1 5 -1 -1 3 1 2 4 -1

3 -1 2 4 1 4 3 -1 2 3 4 1 3 -1 2 -1 4 3 5 -1

-1 1 3 5 -1 4 2 1 -1 3 3 2 3 2 -1 3 1 -1 3 -1

3 2 2 3 -1 5 -1 -1 2 3 4 -1 4 1 -1 -1 -1 -1 4 2

-1 3 -1 -1 4 -1 2 -1 2 2 2 5 -1 3 4 -1 -1 2 -1 2

1 4 3 -1 3 2 1 -1 -1 -1 1 3 1 3 3 1 -1 -1 -1 3

4 3 3 -1 4 2 -1 4 -1 -1 2 4 -1 3 4 2 -1 -1 -1 4

-1 5 1 -1 4 1 -1 3 2 2 -1 4 1 3 3 1 -1 -1 -1 3

-1 4 2 1 5 -1 -1 2 1 1 -1 5 -1 5 4 1 2 2 -1 1

2 5 2 -1 3 -1 -1 1 -1 2 -1 4 2 4 3 -1 2 1 -1 -1

2 5 1 1 4 -1 2 1 -1 -1 2 4 -1 3 4 2 -1 -1 -1 4

平方根的方法


        public static double sqrtSquares(double []A) {


            //check A for -1

        double sum = 0;

                for(int i = 0; i<A.length; i++) {

                    if(A[i] < 0 ) {

                        A[i] = 0;

                    }


                    A[i] = Math.sqrt(A[i]);


                    //calculate the running sum;

                    sum += A[i] * A[i] ;

                }

        return Math.sqrt(sum);

        }


编辑:此代码现在可以运行。感谢大家的帮助。


婷婷同学_
浏览 141回答 2
2回答

千万里不及你

&nbsp; &nbsp;public static double sqrtSquares(double []A) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; double sum = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(int i = 0; i<A.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(A[i] < 0 ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A[i] = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum += A[i]*A[i];&nbsp; &nbsp; // calculate the running sum of squares&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Math.sqrt(sum);&nbsp; &nbsp; &nbsp; &nbsp; }基于余弦相似度定义: https:&nbsp;//en.wikipedia.org/wiki/Cosine_similarity

ITMISS

根据我们的讨论以及您对问题的解释,在您的代码中发现了以下问题。函数中的逻辑sqrtSquares()有缺陷。它仍然需要修正,因为您正在实现余弦相似度。为了方便我再写一次:public static double sqrtSquares(double []A) {    double sum = 0;    for(int i = 0; i<A.length; i++) {        if(A[i] < 0 ) {            A[i] = 0;        }        sum += A[i]*A[i];    // calculate the running sum of squares    }    return Math.sqrt(sum);   // calculate the square root of the sum of squares}使用两个 return 语句(其中一个位于 for 循环内)在仅处理数组的第一个元素后返回值。因此,将 return 语句拉到循环之外。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java