Что не так с моим кодом для расчета стандартного отклонения?

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

введите описание изображения здесь

Вот мой код [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.

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

1 ответ

Решение

Если ты 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);

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

Другие вопросы по тегам