假设我有两个阵列:
a=[168, 76, 62, 86]
b=[168, 80, 65, 90]
我的输入
[166.5, 75.5, 62, 86]
现在我想把数组“a”作为我的“结果”,因为它更像“a”而不是“b”。
我该怎么做?
答案 0 :(得分:4)
您可以收集绝对增量并选择误差较小的增量。
var array1 = [168, 76, 62, 86],
array2 = [168, 80, 65, 90],
input = [166.5, 75.5, 62, 86],
error = [array1, array2].map(function (a) {
return input.reduce(function (r, b, i) {
return r + Math.abs(a[i] -b);
}, 0);
});
console.log(error); // [2, 13] take the first one with smaller error.

答案 1 :(得分:2)
假设您有两个数字数组
x = [x 1 ,x 2 ,...,x n ]
y = [y 1 ,y 2 ,...,y n ]
它们之间的差异(即反相似性)是通过将它们传递给某个误差函数来计算的 E 让我们说
E =Σ(x i - y i ) 2
与计算相同:
(x 1 - y 2 ) 2 + ... +(x n - y n ) 2
=Σx 2 +Σy 2 - Σ(2x i y i )
=Σx i 2 +Σy i 2 - 2Σx i 子>ΣY<子> I 子> 的
这意味着我们现在只能使用内置的Javascript方法.map()
和.reduce()
。
const toSquare(ar) = ar.map( v => v*v )
const sum(ar) = ar.reduce( (acc, v) => acc + v )
function error(ar1, ar2) {
return sum(toSquare(ar1)) + sum(toSquare(ar2)) + 2*sum(ar1)*sum(ar2)
}
更简单:
您还可以使用underscore's或lodash's .zip
功能:
function error(ar1, ar2) {
return _.zip([ar1, ar2]).map( pair => Math.pow(p[0]-p[1], 2) ).reduce( (acc, v) => acc + v )
}
答案 2 :(得分:1)
您必须创建手动功能才能执行此操作。 没有内置方法可以这样做。
function closest( inputArray, controlArrays) {
var margins;
for(var i=0, iMax=controlArrays.length; i < iMax; i++ ){
margins[i] = 0;
for(var j=0, jMax=inputArray.length; j < jMax; j++) {
//get the difference between the numbers and add it for the margins for that control array
margins[i] += Math.abs(inputArray[j]-controlArrays[j][i]);
}
}
//find smallest margin
var index = 0;
var value = margins[0];
for (var m = 1, mMax = temp.length; m < mMax; m++) {
if (temp[m] < value) {
value = temp[m];
index = m;
}
}
//return the smalles margin;
return controlArrays[index];
}