我有一个看起来像这样的数据集(原始数据是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);
关于我为何收到不同结果的任何想法?
我将不胜感激, 谢谢!
答案 0 :(得分:0)
目前,您使用
行多次覆盖了结果[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以查看虹膜的最小距离。