Что не так с моим кодом для расчета стандартного отклонения?
Я пытаюсь вычислить стандартное отклонение набора чисел, как в 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 не будет применена к первому элементу.