标准差javascript

时间:2011-09-08 06:18:15

标签: javascript standard-deviation

我试图获得用户输入字符串的标准偏差。我有如下,但它返回错误的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>

7 个答案:

答案 0 :(得分:5)

我认为(主要)问题出现在这一行:

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

应该是:

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

您的代码正在尝试将temp[i]中的字符串用作数字并从中减去mean,然后将其平方,然后解析结果值。在计算中使用它之前需要在之前使用parseFloat 。此外,,2调用的结束时,Math.pow还有parseFloat(),因此平方也无法正常工作。

使用更有意义的变量名称也会有所帮助,我的意思是,例如,你有一个名为“square”的变量来保存平方根操作的结果。

P.S。如果用户输入非数字数据,您需要添加一些错误检查。检查NaN的结果是否为{{1}}。我倾向于通过数组解析和检查有效数字进行初始循环,将解析后的数字存储在第二个数组中(或将它们写回第一个数组),如果有任何无效,则给用户一个错误消息在那一点上停下来。然后在实际计算中,您不必担心解析(或者,在您的情况下,在第二个循环中再次解析)。

答案 1 :(得分:3)

如果不喜欢很多代码,则可以从数组中获取标准差的速记方法:

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 :(得分:2)

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

标准偏差功能的快速实现:

const sd = numbers => {
  const mean = numbers.reduce((acc, n) => acc + n) / numbers.length;
  return Math.sqrt(
    numbers.reduce((acc, n) => (n - mean) ** 2) / numbers.length
  );
};

正确的SD版本:

const correctedSd = numbers => {
  const mean = numbers.reduce((acc, n) => acc + n) / numbers.length;
  return Math.sqrt(
    numbers.reduce((acc, n) => (n - mean) ** 2) / (numbers.length - 1)
  );
};

答案 4 :(得分:0)

此ES6实现与Excel的内置STDEV.PSTDEV.S相匹配(调用.S时默认为STDEV)。在此处传递true的{​​{1}}标志将匹配Excel的usePopulation

STDEV.P

Original Source

答案 5 :(得分:0)

标准偏差非常简单。

  1. 计算平均值
  2. 将每个数字的减法与平均值相乘。再次平均这些新数字以获得方差。
  3. 最后对方差进行平方根以得到标准偏差。
function standardDeviation(numArray) {
  const mean = numArray.reduce((s, n) => s + n) / numArray.length;
  const variance = numArray.reduce((s, n) => s + (n - mean) ** 2, 0) / numArray.length;
  return Math.sqrt(variance);
}

如果你有一个字符串数组,记得先转换浮点数组array.map(s => parseFloat(s))

答案 6 :(得分:-1)

此函数起作用并产生与numjs相同的结果

const st = (numbers) => {
  const mean = numbers.reduce((acc, item) => acc + item) / numbers.length;
  return Math.sqrt(numbers.reduce((acc, item) => acc + Math.pow((parseFloat(item) -mean), 2)))
}