Javascript 皮尔逊相关函数

Javascript 皮尔逊相关函数,javascript,algorithm,Javascript,Algorithm,我正在进行“编程集体智能”的练习,但我使用的是JavaScript。皮尔逊相关算法有点问题。下面是函数: function rec(object1, object2) { var sum1 = 0; var sum2 = 0; var squareSum1 = 0; var squareSum2 = 0; var productsSum = 0; var i; var commonKeys = commonProperties(object1, object2);

我正在进行“编程集体智能”的练习,但我使用的是JavaScript。皮尔逊相关算法有点问题。下面是函数:

function rec(object1, object2) {
  var sum1 = 0;
  var sum2 = 0;
  var squareSum1 = 0;
  var squareSum2 = 0;
  var productsSum = 0;
  var i;
  var commonKeys = commonProperties(object1, object2);

  for (i = 0; i >= commonKeys.length; i += 1) {
    sum1 += object1[commonKeys[i]];
    sum2 += object2[commonKeys[i]];

    squareSum1 += Math.pow(object1[commonKeys[i]], 2);
    squareSum2 += Math.pow(object2[commonKeys[i]], 2);

    productsSum += object1[commonKeys[i]] * object2[commonKeys[i]];
  }

  var num1 = productsSum - (sum1 * sum2 / commonKeys.length);
  var num2 = Math.sqrt((squareSum1 - (Math.pow(sum1, 2) / commonKeys.length)) * (squareSum2 - (Math.pow(sum2, 2) / commonKeys.length)));

  return num1 / num2;
}

完整的JSFIDLE是。我已经通过JSLint运行了它,这就是它可能有点混乱的原因。有人知道怎么回事吗?

您在条件“for”中犯了一个小错误,var“i”永远不会超过commonkey.length

function rec(object1, object2) {
  var sum1 = 0;
  var sum2 = 0;
  var squareSum1 = 0;
  var squareSum2 = 0;
  var productsSum = 0;
  var i;
  var commonKeys = commonProperties(object1, object2);

  for (i = 0; i < commonKeys.length; i += 1) {
    sum1 += object1[commonKeys[i]];
    sum2 += object2[commonKeys[i]];

    squareSum1 += Math.pow(object1[commonKeys[i]], 2);
    squareSum2 += Math.pow(object2[commonKeys[i]], 2);

    productsSum += object1[commonKeys[i]] * object2[commonKeys[i]];
  }

  var num1 = productsSum - (sum1 * sum2 / commonKeys.length);
  var num2 = Math.sqrt((squareSum1 - (Math.pow(sum1, 2) / commonKeys.length)) * (squareSum2 - (Math.pow(sum2, 2) / commonKeys.length)));

  return num1 / num2;
}
函数rec(object1、object2){
var-sum1=0;
var-sum2=0;
var squareSum1=0;
var squareSum2=0;
var-productsSum=0;
var i;
var commonKeys=commonProperties(object1,object2);
对于(i=0;i

它工作得很好,答案是“-1”


再见。

根据我的评论,您永远不会以
i
的身份进入for循环。更正此错误后,您的算法是正确的。我已经用Excel为rec(janeSmith,johnSmith)验证了这一点。Excel返回0.650791373,而脚本返回0.65079134559685

函数相交\u(a,b){
var结果=[];
而(a.length>0&&b.length>0){
if(a[0]b[0]){
b、 移位();
}else/*他们是平等的*/{
结果:推(a.shift());
b、 移位();
}
}
返回结果;
}
函数commonProperties(object1、object2){
var keys1=Object.keys(object1);
var keys2=Object.keys(object2);
返回交点(键1、键2);
}
var johnSmith={
“Zoolander”:2.5,
“蝙蝠侠开始”:3.5,
“死池”:4.5,
“雷神”:1.5
};
var janeSmith={
“Zoolander”:4.5,
“蝙蝠侠开始”:3,
“死亡池”:5,
“雷神”:2.5,
“复仇者”:4,
“实习”:2.5
};
var johnDoe={
“Zoolander”:4,
“实习”:3,
“蝙蝠侠开始”:4.5,
“雷神”:5
};
函数rec(对象1、对象2){
var-sum1=0;
var-sum2=0;
var squareSum1=0;
var squareSum2=0;
var-productsSum=0;
var i;
var commonKeys=commonProperties(object1,object2);
对于(i=0;i

价值:


num1是0,num2是0,0/0=n因为num2是0,所以你得到了NaN。不允许被零除。您从未以
i
的形式输入for循环,但是,这并不是唯一的错误。我认为你的方程式不正确。