Created
September 9, 2013 20:24
-
-
Save matt-west/6500993 to your computer and use it in GitHub Desktop.
Pearson Correlation (JavaScript)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @fileoverview Pearson correlation score algorithm. | |
* @author [email protected] (Matt West) | |
* @license Copyright 2013 Matt West. | |
* Licensed under MIT (http://opensource.org/licenses/MIT). | |
*/ | |
/** | |
* Calculate the person correlation score between two items in a dataset. | |
* | |
* @param {object} prefs The dataset containing data about both items that | |
* are being compared. | |
* @param {string} p1 Item one for comparison. | |
* @param {string} p2 Item two for comparison. | |
* @return {float} The pearson correlation score. | |
*/ | |
function pearsonCorrelation(prefs, p1, p2) { | |
var si = []; | |
for (var key in prefs[p1]) { | |
if (prefs[p2][key]) si.push(key); | |
} | |
var n = si.length; | |
if (n == 0) return 0; | |
var sum1 = 0; | |
for (var i = 0; i < si.length; i++) sum1 += prefs[p1][si[i]]; | |
var sum2 = 0; | |
for (var i = 0; i < si.length; i++) sum2 += prefs[p2][si[i]]; | |
var sum1Sq = 0; | |
for (var i = 0; i < si.length; i++) { | |
sum1Sq += Math.pow(prefs[p1][si[i]], 2); | |
} | |
var sum2Sq = 0; | |
for (var i = 0; i < si.length; i++) { | |
sum2Sq += Math.pow(prefs[p2][si[i]], 2); | |
} | |
var pSum = 0; | |
for (var i = 0; i < si.length; i++) { | |
pSum += prefs[p1][si[i]] * prefs[p2][si[i]]; | |
} | |
var num = pSum - (sum1 * sum2 / n); | |
var den = Math.sqrt((sum1Sq - Math.pow(sum1, 2) / n) * | |
(sum2Sq - Math.pow(sum2, 2) / n)); | |
if (den == 0) return 0; | |
return num / den; | |
} |
The above code has a bug, n is used before being defined.
let n = x.length
needs to be before theconst calc ...
line.No it hasn't. The third line defines function
calc
without calling it.
Well, it's still bad form. You're referencing a global that's defined later in scope and generally that's bad form.
The current version of ESLint doesn't like this, but as you're only giving an example here I guess it might be fine.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
No it hasn't. The third line defines function
calc
without calling it.