23

我正在尝试获取用户输入字符串的标准偏差。我有以下内容,但它返回错误的 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

9 回答 9

46

如果您不喜欢大量代码,则从数组中获取标准差的速记方法:

function getStandardDeviation (array) {
  const n = array.length
  const mean = array.reduce((a, b) => a + b) / n
  return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n)
}
于 2018-12-02T03:39:12.760 回答
7

对于寻找更通用解决方案的任何人,这里是添加到 Array# 的标准偏差函数。该函数期望在一个数字数组上调用。

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));
};
于 2015-08-25T10:19:09.873 回答
6

我认为(主要)问题出在这条线上:

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

应该:

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

您的代码试图将字符串 intemp[i]用作数字并mean从中减去,然后将其平方,然后解析结果值。在计算中使用它之前需要 parseFloat 。此外,您,2的呼叫的右括号在外面,Math.pow因此平方也不起作用。

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

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

于 2011-09-08T06:31:06.473 回答
3

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);

于 2017-01-21T15:44:02.870 回答
1

这个 ES6 实现匹配 Excel 的内置STDEV.PSTDEV.S(是调用.S时的默认值STDEV)。在这里传递true标志usePopulation将匹配 Excel 的STDEV.P

const standardDeviation = (arr, usePopulation = false) => {
  const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length;
  return Math.sqrt(
    arr.reduce((acc, val) => acc.concat((val - mean) ** 2), []).reduce((acc, val) => acc + val, 0) /
      (arr.length - (usePopulation ? 0 : 1))
  );
};

console.log('STDEV.S =>',
  standardDeviation([
    10, 2, 38, 23, 38, 23, 21
  ])
);

console.log('STDEV.P =>',
  standardDeviation([
    10, 2, 38, 23, 38, 23, 21
  ], true)
);

原始来源

于 2020-09-10T21:47:28.240 回答
1

标准偏差非常简单。

  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 - 1);
  return Math.sqrt(variance);
}

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

于 2021-07-05T15:56:38.337 回答
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)
  );
};

于 2020-05-16T22:54:13.953 回答
0

您可以使用mathjs

math.std(array)
于 2021-12-07T11:25:53.230 回答
-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)))
}

于 2020-07-14T09:27:49.243 回答