Стандартное отклонение JavaScript - PullRequest
6 голосов
/ 08 сентября 2011

Я пытаюсь получить стандартное отклонение строки ввода пользователя. Я имею следующее, но это возвращает неправильное значение для SD. Расчет должен идти следующим образом: Сумма значений / числовые значения = среднее Квадрат (сумма каждого значения-среднего) Сумма квадратов / числовых значений.

Помощь оценена (и объяснение, если возможно):

function sum() {
  var val = document.getElementById('userInput').value;
  var temp = val.split(" ");
  var total = 0;
  var v;
  var mean = total / temp.length;
  var total1 = 0;
  var v1;
  var temp23;
  var square;

  for (var i = 0; i < temp.length; i++) {
    v = parseFloat(temp[i]);
    total += v;
  }

  mean = total / temp.length;

  for (var i = 0; i < temp.length; i++) {
    v1 = parseFloat(Math.pow(temp[i] - mean), 2);
    total1 += v1;
  }


  temp23 = total1 / temp.length;
  square = Math.sqrt(temp23);

  document.write(total + '<br />');
  document.write(mean + '<br />');
  document.write(square);
}
<html>

<head>
</head>

<body>
  <form id="input">
    <textarea id="userInput" rows=20 cols=20></textarea>
    <input id="Run" type=Button value="run" onClick="sum()" />
  </form>
</body>

</html>

Ответы [ 4 ]

5 голосов
/ 25 августа 2015

Для тех, кто ищет более общее решение, вот функция стандартного отклонения, добавленная к массиву #.Функция ожидает вызова в массиве чисел.

Array.prototype.stanDeviate = function(){
   var i,j,total = 0, mean = 0, diffSqredArr = [];
   for(i=0;i<this.length;i+=1){
       total+=this[i];
   }
   mean = total/this.length;
   for(j=0;j<this.length;j+=1){
       diffSqredArr.push(Math.pow((this[j]-mean),2));
   }
   return (Math.sqrt(diffSqredArr.reduce(function(firstEl, nextEl){
            return firstEl + nextEl;
          })/this.length));
};
5 голосов
/ 08 сентября 2011

Я думаю (главная) проблема в этой строке:

v1 = parseFloat(Math.pow(temp[i]-mean),2);

Должно быть:

v1 = Math.pow(parseFloat(temp[i])-mean),2);

Ваш код пытается использовать строку в temp[i] в качестве числа и вычесть из нее mean, а затем возвести ее в квадрат и затем проанализировать полученное значение. Нужно разобрать Float перед , используя его в расчете. Также у вас есть ,2 за пределами заключительного парентеза для вызова Math.pow, так что квадрат не будет работать.

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

P.S. Вам нужно добавить некоторую проверку ошибок, если пользователь вводит нечисловые данные. Убедитесь, что результат parseFloat() не равен NaN. Я был бы склонен сделать начальный цикл разбора массива и проверки на допустимые числа, сохранения проанализированных чисел во втором массиве (или записи их обратно в первый массив), и, если таковые имеются, дают пользователю сообщение об ошибке в этот момент и остановимся. Тогда в ваших реальных вычислениях вам не нужно беспокоиться о разборе по ходу (или, в вашем случае, повторном разборе во втором цикле).

4 голосов
/ 02 декабря 2018

Сокращенный метод для получения стандартного отклонения от массива, если вам не нравится много кода:

n = array.length;
mean = array.reduce((a,b) => a+b)/n;
s = Math.sqrt(array.map(x => Math.pow(x-mean,2)).reduce((a,b) => a+b)/n);
2 голосов
/ 21 января 2017

function StandardDeviation(numbersArr) {
    //--CALCULATE AVAREGE--
    var total = 0;
    for(var key in numbersArr) 
       total += numbersArr[key];
    var meanVal = total / numbersArr.length;
    //--CALCULATE AVAREGE--
  
    //--CALCULATE STANDARD DEVIATION--
    var SDprep = 0;
    for(var key in numbersArr) 
       SDprep += Math.pow((parseFloat(numbersArr[key]) - meanVal),2);
    var SDresult = Math.sqrt(SDprep/numbersArr.length);
    //--CALCULATE STANDARD DEVIATION--
    alert(SDresult);
    
}

var numbersArr = [10, 11, 12, 13, 14];
StandardDeviation(numbersArr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...