2015-01-23 2 views
0

Я пытаюсь вычислить стандартное отклонение набора чисел, поскольку Excel будет с функцией STDEVPA(), но я не получаю правильный результат. Я следую формуле:Что не так с моим кодом для вычисления стандартного отклонения?

enter image description here

Вот мой [Node] Код:

var _ = require('underscore'); 

var prices = [ 
    1.37312, 
    1.35973, 
    1.35493, 
    1.34877, 
    1.34853, 
    1.35677, 
    1.36079, 
    1.36917, 
    1.36769, 
    1.3648, 
    1.37473, 
    1.37988, 
    1.37527, 
    1.38053, 
    1.37752, 
    1.38652, 
    1.39685, 
    1.39856, 
    1.39684, 
    1.39027 
]; 

var standardDeviation = 0; 

var average = _(prices).reduce(function(total, price) { 
    return total + price; 
})/prices.length; 

var squaredDeviations = _(prices).reduce(function(total, price) { 
    var deviation = price - average; 
    var deviationSquared = deviation * deviation; 

    return total + deviationSquared; 
}); 

var standardDeviation = Math.sqrt(squaredDeviations/prices.length); 

console.log(standardDeviation); 

Когда я запускаю это, я получаю 0.26246286981807065, и вместо этого я должен получить 0,0152.

Обратите внимание, что я размещен на StackOverflow, а не на сайте математики, потому что, на мой взгляд, это больше ориентировано на программирование, чем математику. Если я опубликую там, они скажут мне, что я буду размещать здесь, потому что это связано с программированием.

+0

Проводили ли вы какие-либо отладки? –

+0

Как точка останова или что-то в этом роде? Нет. Я запустил программу и получил представленную информацию. –

ответ

3

Если вы внесли console.log(total) в свой расчет squaredDeviations, вы увидите, что начинаете со значения 1.37312, а именно, первое, что есть в вашем списке. Вам нужно явно указать ему, чтобы он начинался с 0, что является третьим необязательным аргументом для уменьшения. Просто замените:

var squaredDeviations = _(prices).reduce(function(total, price) { 
    var deviation = price - average; 
    var deviationSquared = deviation * deviation; 

    return total + deviationSquared; 
}); 

с

var squaredDeviations = _(prices).reduce(function(total, price) { 
    var deviation = price - average; 
    var deviationSquared = deviation * deviation; 

    return total + deviationSquared; 
}, 0); 

Смотрите underscore documentation для более подробной информации. В частности, обратите внимание, что при вычислении среднего значения все работает, не передавая этот дополнительный аргумент, потому что в этом случае функция итерации не будет применена к первому элементу.

+0

Святое дерьмо ... Я не понимал, что должен был инициализировать общее ... спасибо Амит! –

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