2015-07-03 3 views
0

У меня есть набор данных, который выглядит следующим образом (Original данные here):Вычислить ближайший евклидово расстояние с 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); 

Любые идеи о том, почему я получаю разные результаты?

Я был бы признателен за любую помощь, Спасибо!

+2

Я получаю ожидаемые результаты - см .: https://jsfiddle.net/stvsg0we/. Тем не менее, вы не ошибаетесь, переписывая предыдущие результаты по результату линии [i] = Math.sqrt (a3 + a4); '? –

+1

Вы правы @JosephRedfern, он печатает правильные результаты для трех строк кода JSON. Но у меня есть более длинный список, и он не печатает правильные результаты. Возможно, это связано с чрезмерным написанием вы упомянули. Но я не мог понять. Можете ли вы попытаться объяснить больше? Большое спасибо! – supaplex

+0

Можете ли вы обновить свой вопрос, чтобы добавить немного больше данных, чтобы проблемы были более легковоспроизводимыми? –

ответ

0

В настоящее время, вы помарка результата [I] несколько раз с линией

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

ли вы на самом деле нужно хранить расстояния между всей ирисой? Вы можете отслеживать текущий минимум (и индексы двух ирисов) и обновлять по мере необходимости. Избавьтесь от массива результатов, и заменить его на объект, который выглядит как:

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

, где я и J являются индексы в списке ирисов.

Для каждой итерации цикла проверьте, меньше ли вычисленное расстояние меньше minPair.distance. Если это так, обновите minPaid.irisA, minPaid.irisB и minPair.distance до соответствующего значения.

Как только вы закончите цикл, вы можете занести в журнал minPair, чтобы увидеть, что ирисы имеют минимальное расстояние.

+0

Да, мне нужно хранить расстояния между всеми ирисами, так как я буду использовать эту информацию позже. – supaplex

+1

В этом случае я бы сохранил массив результатов [], но также добавил объект minPair и обновил его, как описано. Вы можете изменить результаты как массив массивов, где результаты [i] [j] == расстояние между i и j. –

Смежные вопросы