JavaScript余弦相似度函数

时间:2018-07-16 12:49:39

标签: javascript similarity cosine

我试图创建一个余弦相似度函数,然后在HTML元素中显示结果。我写了以下内容:

function cosinesim(A,B){
        var dotproduct=0;
        var mA=0;
        var mB=0;
        for(i = 0; i < A.length;){
            dotproduct += (A[i] * B[i]);
            mA += (A[i]*A[i]);
            mB += (B[i]*B[i]);
        }
        mA = Math.sqrt(mA);
        mB = Math.sqrt(mB);
        var similarity = (dotproduct)/(mA)*(mB)
        return similarity;
    }

//.....

var array1 = [1,0,0,1];
var array2 = [1,0,0,0];

var p = cosinesim(array1,array2);
document.getElementById("sim").innerHTML = String(p);

我已经测试过,并且我输入的两个数组的长度都相同,但是当我的代码运行到此位时,它崩溃了,我似乎找不到错误的地方。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

您错过了循环中的i++,导致无休止的

for(i = 0; i < A.length;)替换为for(i = 0; i < A.length;i++)解决了该问题

答案 1 :(得分:1)

commandline

这应该给出实际的余弦相似度。 您不见了:
1.)循环中的i ++,如前所述。
2.)这行中(mA)*(mB)周围有多余的括号:var相似性=(dotproduct)/((mA)*(mB))->否则除法是在乘法之前完成的。 >

答案 2 :(得分:0)

function cosinesim(A,B){
        var dotproduct=0;
        var mA=0;
        var mB=0;
        for(i = 0; i < A.length; i++){
            dotproduct += (A[i] * B[i]);
            mA += (A[i]*A[i]);
            mB += (B[i]*B[i]);
        }
        mA = Math.sqrt(mA);
        mB = Math.sqrt(mB);
        var similarity = (dotproduct)/(mA)*(mB)
        return similarity;
    }


var array1 = [1,0,0,1];
var array2 = [1,0,0,0];

var p = cosinesim(array1,array2);

console.log(p);

答案 3 :(得分:0)

使用地图并减少javascript的功能

function dotp(x, y) {
  function dotp_sum(a, b) {
    return a + b;
  }
  function dotp_times(a, i) {
    return x[i] * y[i];
  }
  return x.map(dotp_times).reduce(dotp_sum, 0);
}

function cosineSimilarity(A,B){
  var similarity = dotp(A, B) / (Math.sqrt(dotp(A,A)) * Math.sqrt(dotp(B,B)));
  return similarity;
}


var array1 = [1,2,2,1];
var array2 = [1,3,2,0];

var p = cosineSimilarity(array1,array2);

console.log(p);

希望这会有所帮助!!编码愉快!