繁体   English   中英

使用JavaScript计算最近的欧几里得距离

[英]Calculate closest Euclidean Distance with JavaScript

我有一个看起来像这样的数据集(原始数据在这里 ):

var irisjson = [
    {"sepalLength": 5.1, "sepalWidth": 3.5, "petalLength": 1.4, "petalWidth": 0.2, "species": "setosa"},
    {"sepalLength": 4.9, "sepalWidth": 3.0, "petalLength": 1.4, "petalWidth": 0.2, "species": "setosa"},
    {"sepalLength": 4.7, "sepalWidth": 3.2, "petalLength": 1.3, "petalWidth": 0.2, "species": "setosa"}....]

我想计算欧几里得距离并找到最接近的点。 我写的函数如下:

function findClosest(irisjson){

    var result = [];
    //Calculate Euc. Dist
    for(var i=0; i < irisjson.length; i++){
        for(var j = 1; j < irisjson.length-1 ; j++){
            var a1, a2 , a3 , a4 ;

            a1 = irisjson[i].sepalLength -
                    irisjson[j].sepalLength;

            a2 = irisjson[i].sepalWidth -
                    irisjson[j].sepalWidth;

            a3 = Math.pow(a1, 2);
            a4 = Math.pow(a2, 2);

            result[i] = Math.sqrt(a3 + a4);


        }
        console.log(result[i]);
    }
}

将结果打印到控制台时,在第一行中看到1.1045361017187265 但是,当我手动测试它时,如下所示,结果为0.5385164807134502

a1 = irisjson[0].sepalLength -
            irisjson[1].sepalLength;

    a2 = irisjson[0].sepalWidth -
            irisjson[1].sepalWidth;

    a3 = Math.pow(a1, 2);
    a4 = Math.pow(a2, 2);

    result = Math.sqrt(a3 + a4);
    console.log("res:", result);

为什么我会收到不同的结果?

我将不胜感激,谢谢!

目前,您正在用该行多次覆盖结果[i]

result[i] = Math.sqrt(a3 + a4);

您是否真的需要存储所有光圈之间的距离? 您可以跟踪当前的最小值(以及两个光圈的索引),并进行适当的更新。 摆脱结果数组,并将其替换为一个类似于以下内容的对象:

minPair = {'irisA': i, 'irisB': j, distance: 0};

其中i和j是虹膜列表的索引。

对于每个循环迭代,检查计算的距离是否小于minPair.distance。 如果是这样,请将minPaid.irisA,minPaid.irisB和minPair.distance更新为适当的值。

完成循环后,您可以登录minPair以查看哪些虹膜具有最小距离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM