PHP Conference Japan 2024

stats_standard_deviation

(PECL stats >= 1.0.0)

stats_standard_deviation返回标准差

描述

stats_standard_deviation(数组 $a, 布尔值 $sample = false): 浮点数

返回 a 中值的标准差。

参数

a

要查找标准差的数据数组。请注意,数组的所有值都将强制转换为 浮点数

sample

指示 a 是否表示总体样本;默认为 false

返回值

成功时返回标准差;失败时返回 false

错误/异常

a 中的值少于 2 个时,会引发 E_WARNING

添加注释

用户贡献的注释 5 条注释

levim at php dot net
10 年前
这是一个非常严格地遵循 PECL 源代码的实现。这对那些想要使用它但没有扩展的人以及那些想要了解正在发生的事情的人很有用。

<?php

if (!function_exists('stats_standard_deviation')) {
/**
* 此用户级实现严格遵循实现;
* 它不会尝试以任何方式改进代码或算法。如果您的数组中少于 2 个值,它将
* 触发警告,就像
* 扩展一样(尽管作为 E_USER_WARNING,而不是 E_WARNING)。
*
* @param array $a
* @param bool $sample [可选] 默认为 false
* @return float|bool 标准差或错误时的 false。
*/
function stats_standard_deviation(array $a, $sample = false) {
$n = count($a);
if (
$n === 0) {
trigger_error("数组中没有元素", E_USER_WARNING);
return
false;
}
if (
$sample && $n === 1) {
trigger_error("数组中只有一个元素", 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);
}
}

?>
Pascal Woerde
14 年前
如果您想要一个用于总体和样本的函数,您可以使用此函数

<?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
14 年前
如果您没有 stat 包,您可以使用这些函数

<?php

// 计算值平方 - 平均值的函数
function sd_square($x, $mean) { return pow($x - $mean,2); }

// 计算标准差的函数(使用 sd_square)
function sd($array) {

// 平方和的平方根除以 N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}

?>
tripollite at gmail dot com
12 年前
计算值平方 - 平均值的函数

<?php
function sd_square($x, $mean) { return pow($x - $mean,2); }
?>

计算标准差的函数(使用 sd_square)
<?php
function sd($array) {

// 计算平方和的平方根除以 N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) );
}
?>

如果不加 1 到计数,效果会更好

常数的标准差必须为 0(http://en.wikipedia.org/wiki/Standard_deviation

不同的方法
<?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
12 年前
需要注意的是,此函数还会将数组的所有值转换为浮点数。如果传递一个整数数组,它们将输出为一个浮点数数组。

$data = array(2,3,3,3,3,2,5);
var_dump($data);
$standardDeviation = stats_standard_deviation($data);
var_dump($data);

输出
数组
0 => int 2
1 => int 3
2 => int 3
3 => int 3
4 => int 3
5 => int 2
6 => int 5
数组
0 => float 2
1 => float 3
2 => float 3
3 => float 3
4 => float 3
5 => float 5
6 => float 2
To Top