【问题标题】:JavaScript Cosine similarity functionJavaScript 余弦相似度函数
【发布时间】:2018-07-16 12:49:39
【问题描述】:

我正在尝试创建一个余弦相似度函数,然后在 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);

我已经测试过,我输入的两个数组的长度相同,但是当我的代码运行到这个位时,它崩溃了,我似乎找不到问题所在。

感谢任何帮助,谢谢。

【问题讨论】:

  • 请在你的代码中添加array1和array2的定义

标签: javascript similarity trigonometry


【解决方案1】:
function cosinesim(A,B){
    var dotproduct=0;
    var mA=0;
    var mB=0;
    for(i = 0; i < A.length; i++){ // here you missed the 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)) // here you needed extra brackets
    return similarity;
}


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

var p = cosinesim(array1,array2);

console.log(p);

这应该给出实际的余弦相似度。 您缺少:
1.) 如前所述,循环中的 i++。
2.) 在这一行中 (mA)*(mB) 周围的额外括号:varsimilarity = (dotproduct)/((mA)*(mB)) -> 否则在乘法之前进行除法。

【讨论】:

    【解决方案2】:

    您在循环中错过了i++,这导致了无穷无尽的循环

    for(i = 0; i &lt; A.length;) 替换为for(i = 0; i &lt; A.length;i++) 解决了这个问题

    【讨论】:

    • 这里也有严重错误:(dotproduct)/(mA)*(mB) 是错误的,因为运算符优先级。使用 (dotproduct)/(mA * mB) 代替,否则分数不会是在 [0,1]
    【解决方案3】:

    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);

    【讨论】:

    • 它可以超过1,而我认为它应该在-11之间。它给出了例如2 如果我比较 [1,1,0,0][1,1,0,0]
    【解决方案4】:

    使用地图并减少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);

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

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2011-01-01
      • 2017-12-12
      • 2013-05-24
      • 1970-01-01
      • 2014-02-25
      • 2018-06-14
      • 2018-10-27
      相关资源
      最近更新 更多