2014-03-03 78 views
1

我有一组数字,如下所示。然而,我只能计算如下所示仅输出1个结果整个阵列的标准偏差:计算PHP中每5个数字的标准差

代码:

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

您正在寻找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

这个答案比我的好,我会删除我的答案,并upvote它 –

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