JavaScript余弦相似度函数
JavaScript Cosine similarity function
我正在尝试创建余弦相似度函数,然后在 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);
我已经测试过,我输入的两个数组长度相同,但是当我的代码运行到这个位时它崩溃了,我似乎找不到问题所在。
感谢任何帮助,谢谢。
你在你的循环中错过了 i++
,这导致了一个无休止的循环
将 for(i = 0; i < A.length;)
替换为 for(i = 0; i < A.length;i++)
解决了问题
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);
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) 周围的额外括号:var similarity = (dotproduct)/((mA)*(mB)) -> 否则除法在乘法之前完成。
使用地图并减少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);
希望对您有所帮助!!编码愉快!!
我正在尝试创建余弦相似度函数,然后在 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);
我已经测试过,我输入的两个数组长度相同,但是当我的代码运行到这个位时它崩溃了,我似乎找不到问题所在。
感谢任何帮助,谢谢。
你在你的循环中错过了 i++
,这导致了一个无休止的循环
将 for(i = 0; i < A.length;)
替换为 for(i = 0; i < A.length;i++)
解决了问题
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);
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) 周围的额外括号:var similarity = (dotproduct)/((mA)*(mB)) -> 否则除法在乘法之前完成。
使用地图并减少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);
希望对您有所帮助!!编码愉快!!