计算PHP中每5个数字的标准偏差

时间:2014-03-03 05:38:04

标签: php arrays std standard-deviation

我有一系列数字如下所示。但是,我只能计算整个数组的标准偏差,只有输出1结果,如下所示:

代码:

function standard_deviation_sample ($a)
{
  //variable and initializations
  $the_standard_deviation = 0.0;
  $the_variance = 0.0;
  $the_mean = 0.0;
  $the_array_sum = array_sum($a); //sum the elements
  $number_elements = count($a); //count the number of elements

  //calculate the mean
  $the_mean = $the_array_sum / $number_elements;

  //calculate the variance
    for ($i = 0; $i < $number_elements; $i++)
    {
      //sum the array
      $the_variance = $the_variance + ($a[$i] - $the_mean) * ($a[$i] - $the_mean);
    }

  $the_variance = $the_variance / ($number_elements - 1.0);

  //calculate the standard deviation
  $the_standard_deviation = pow( $the_variance, 0.5);

  //return the variance
   return $the_standard_deviation;
}


$a = array(1,2,3,4,9,6,7,8,9,20,11,12,13,14,2,16,17,18,19,27);
$standard_deviation = standard_deviation_sample ($a);

echo "standard_deviation = $standard_deviation<br>";

结果:

standard_deviation = 7.10004

有人知道如何计算每5个数字的标准偏差吗?因此输出将是:

standard_deviation_1 = 3.11448
standard_deviation_2 = 5.70088
standard_deviation_3 = 4.82701
standard_deviation_4 = 4.39318

2 个答案:

答案 0 :(得分:2)

您正在寻找array_chunk();它会将您的阵列拆分为给定大小的较小数组,因此您的代码现在将是:

$a = array_chunk(array(1,2,3,4,9,6,7,8,9,20,11,12,13,14,2,16,17,18,19,27), 5);

foreach($a as $b){
  echo "standard_deviation: " . standard_deviation_sample($b);
}

参考:http://uk1.php.net/array_chunk

如果您需要standard_deviation_1输出末尾的数字,可以将循环更改为for()循环,如下所示:

for($i = 0; $i < count($a); $i++){
  echo "standard_deviation_" . ($i + 1) . " " . standard_deviation_sample($a[$i]);
}

答案 1 :(得分:2)

答案是使用array_chunk(),但还有一些可以改进代码本身的东西:

function standard_deviation_sample(array $a)
{
  $the_mean = array_sum($a) / count($a);

  return sqrt(array_reduce($a, function($result, $item) use ($the_mean) {
    return $result + pow($item - $the_mean, 2);
  }, 0) / (count($a) - 1));
}

只需在需要的地方使用变量,就可以大大减少函数本身;其次,计算平方标准差是您可以使用array_reduce()解决的一个很好的例子;你从0的初始值开始,内部函数不断地将平方差异加在一起。

$a = array(1,2,3,4,9,6,7,8,9,20,11,12,13,14,2,16,17,18,19,27);

foreach (array_chunk($a, 5) as $k => $sample) {
  printf("standard_deviation_%d = %.5f<br>\n",
    $k + 1,
    standard_deviation_sample($sample));
}