(PECL stats >= 1.0.0)
stats_standard_deviation — Returns the standard deviation
$a
[, bool $sample
= false
] )本函数还未编写文档,仅有参数列表。
a
sample
tripollite at gmail dot com (2012-06-28 09:58:12)
Function to calculate square of value - mean
<?php
function sd_square($x, $mean) { return pow($x - $mean,2); }
?>
Function to calculate standard deviation (uses sd_square)
<?php
function sd($array) {
// square root of sum of squares devided by N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) );
}
?>
works better if you don't add +1 to the count
standard deviation of a constant must be 0 ( http://en.wikipedia.org/wiki/Standard_deviation )
different way :
<?php
class Tmath{
public static function variance($data, $round = 2)
{
if( count($data) == 0 )
return NULL;
$total_ecart = 0;
$moyenne = self::moyenne($data, 10*$round);
if( $moyenne == 0)
return 0;
foreach( $data as $element)
{
$total_ecart += pow($element, 2);
}
return round($total_ecart/count($data) - pow($moyenne,2),$round);
}
public static function ecartType($data, $round = 2)
{
return round(sqrt(self::variance($data,10*$round)),2);
}
public static function moyenne($data, $round = 2)
{
if( count($data) == 0 )
return NULL;
return round(array_sum($data)/count($data),$round) ;
}
}
?>
pmcdougl at gac dot edu (2012-03-06 22:40:42)
It should be known that this function also casts all of the values of the array to floats. If you pass an array of integers, they will come out as an array of floats.
$data = array(2,3,3,3,3,2,5);
var_dump($data);
$standardDeviation = stats_standard_deviation($data);
var_dump($data);
Prints:
array
0 => int 2
1 => int 3
2 => int 3
3 => int 3
4 => int 3
5 => int 2
6 => int 5
array
0 => float 2
1 => float 3
2 => float 3
3 => float 3
4 => float 3
5 => float 5
6 => float 2
Pascal Woerde (2010-09-07 00:04:21)
If you want one function for the population and sample, you can use this function:
<?php
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
Sharon (2010-04-16 02:40:46)
If you don't have the stat package you can use these functions:
<?php
// Function to calculate square of value - mean
function sd_square($x, $mean) { return pow($x - $mean,2); }
// Function to calculate standard deviation (uses sd_square)
function sd($array) {
// square root of sum of squares devided by N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}
?>