PHP Conference Japan 2024

stats_standard_deviation

(PECL stats >= 1.0.0)

stats_standard_deviation回傳標準差

描述

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

回傳 a 中數值的標準差。

參數

a

要尋找標準差的資料陣列。請注意,陣列的所有值都會被轉換為 float

sample

指出 a 是否代表母體的樣本;預設為 false

回傳值

成功時回傳標準差;失敗時回傳 false

錯誤/例外

a 中的值少於 2 個時,會引發 E_WARNING

新增註解

使用者貢獻的註解 5 則註解

16
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("陣列只有 1 個元素", 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);
}
}

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

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

?>
-2
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) ;
}
}
?>
-5
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