文字

stats_standard_deviation

(PECL stats >= 1.0.0)

stats_standard_deviationReturns the standard deviation

说明

float stats_standard_deviation ( array $a [, bool $sample = false ] )

参数

a

The array of data to find the standard deviation for. Note that all values of the array will be cast to float .

sample

Indicates if a represents a sample of the population; defaults to FALSE .

返回值

Returns the standard deviation on success; FALSE on failure.

错误/异常

Raises an E_WARNING when there are fewer than 2 values in a.

用户评论:

[#1] levim at php dot net [2014-02-24 17:15:30]

Here's an implementation that adheres to the PECL source quite strictly. This is useful for people who want to use it but don't have the extension, as well as for people who want to understand what is going on.

<?php

if (!function_exists('stats_standard_deviation')) {
    

    
function stats_standard_deviation(array $a$sample false) {
        
$n count($a);
        if (
$n === 0) {
            
trigger_error("The array has zero elements"E_USER_WARNING);
            return 
false;
        }
        if (
$sample && $n === 1) {
            
trigger_error("The array has only 1 element"E_USER_WARNING);
            return 
false;
        }
        
$mean array_sum($a) / $n;
        
$carry 0.0;
        foreach (
$a as $val) {
            
$d = ((double) $val) - $mean;
            
$carry += $d $d;
        };
        if (
$sample) {
           --
$n;
        }
        return 
sqrt($carry $n);
    }
}

?>

[#2] 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"$arrayarray_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) == )
            return 
NULL;
        
$total_ecart 0;
        
$moyenne self::moyenne($data10*$round);
        if( 
$moyenne == 0)
            return 
0;
        foreach( 
$data as $element)
        {
            
$total_ecart += pow($element2);
        }
        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) == )
            return 
NULL;
        return 
round(array_sum($data)/count($data),$round) ;
    }
}
?>

[#3] 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

[#4] 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);
}

[#5] 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"$arrayarray_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}

 
?>

上一篇: 下一篇: