Reputation: 191
I am trying to create a cosine similarity function and then display the results in a HTML element. I have written the following:
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);
I have tested and both the arrays I am inputting are the same length, however when my code runs to this bit it crashes and I cant seem to find what is wrong.
Any help is appreciated, thanks.
Upvotes: 10
Views: 12828
Reputation: 111
function cosinesim(A, B) {
var dotproduct = 0;
var mA = 0;
var mB = 0;
for(var 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);
This should give the actual cosine similarity. You were missing:
var i
and i++
in your for
loop, as mentioned before.(mA * mB)
in this line: var similarity = dotproduct / (mA * mB);
Without them, the division is done before the multiplication.Upvotes: 11
Reputation: 51
Using the map and reduce the functionality of 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);
Hope this helps!! Happy coding!!
Upvotes: 4
Reputation: 4220
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);
Upvotes: 0
Reputation: 1515
you missed i++
in your loop which leads to an endless one
replacing for(i = 0; i < A.length;)
to for(i = 0; i < A.length;i++)
fixed the issue
Upvotes: 3