找到最相似的数字数组

时间:2017-08-16 09:21:56

标签: javascript arrays

假设我有两个阵列:

a=[168, 76, 62, 86]

b=[168, 80, 65, 90]

我的输入

[166.5, 75.5, 62, 86]

现在我想把数组“a”作为我的“结果”,因为它更像“a”而不是“b”。

我该怎么做?

3 个答案:

答案 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'slodash'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];
}