【问题标题】:Calculate closest Euclidean Distance with JavaScript用 JavaScript 计算最近的欧几里得距离
【发布时间】:2015-07-03 11:50:42
【问题描述】:

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

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);

关于为什么我会收到不同的结果有什么想法吗?

如果有任何帮助,我将不胜感激, 谢谢!

【问题讨论】:

  • 我得到了您期望的结果 - 请参阅:jsfiddle.net/stvsg0we。也就是说,你不是(错误地)在'result[i] = Math.sqrt(a3 + a4);'这一行上覆盖以前的结果吗?
  • 你是对的@JosephRedfern 它打印了三行 JSON 代码的正确结果。但我有一个更长的列表,它没有打印出正确的结果。这可能与您提到的重写有关。但我无法理解。你能试着解释更多吗?非常感谢!
  • 您能否更新您的问题以包含更多数据,以便更容易重现问题?
  • 我已经更新了问题@JosephRedfern 你可以从这里找到数据:raw.githubusercontent.com/vega/vega/master/examples/data/…
  • 好的,我现在看到了问题——这是由于覆盖造成的。你想找到最近的一对点吗?

标签: javascript euclidean-distance


【解决方案1】:

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

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

您真的需要存储所有虹膜之间的距离吗?您可以跟踪当前最小值(以及两个虹膜的索引),并酌情更新。去掉 results 数组,并将其替换为如下所示的对象:

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

其中 i 和 j 是鸢尾花列表的索引。

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

完成循环后,您可以记录 minPair 以查看哪些虹膜的距离最短。

【讨论】:

  • 是的,我需要存储所有虹膜之间的距离,因为我稍后会使用该信息。
  • 在这种情况下,我会保留 results[] 数组,但也会添加 minPair 对象并按照描述对其进行更新。您可以将结果更改为数组数组,其中 results[i][j] == i 和 j 之间的距离。
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 2015-09-23
  • 1970-01-01
  • 2020-11-29
  • 2018-02-14
  • 2013-04-07
  • 2011-07-19
相关资源
最近更新 更多