如果原始人口未知,我如何计算新的标准偏差?

时间:2014-04-30 11:44:14

标签: php math statistics standard-deviation

from this question on Math SE我有以下情况。

有一组($array)具有任意值,集合中的值($n),它的平均值($mean)和标准偏差( $s)。

$array = array(1, 5, 16, 3, ...);
$n = count($array);
$mean = array_sum($array) / count($array);
$s = sd($array);

sd()函数在PHP comments for the stats_standard_deviation() function上的起源位置

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

现在$array被删除,价值不再可用(出于匿名的原因而说),但是另一个$x值将在其中计算$mean$s(标准偏差)。

我尝试通过此公式计算新的标准差(根据this answer on Math SE):

function m_reverse($n, $mean, $x) {
    return ( $n * $mean + $x ) / ( $n + 1 );
}

function sd_reverse($s, $n, $x, $mean) {
    return sqrt( 1 / $n * ( ( $n - 1 ) * pow( $s, 2 ) + ( $x - $mean ) ) );
}

m_reverse()函数返回正确的新均值。但sd_reverse()功能不胜。任何人都能弄清楚,我做错了什么?也许不适当使用paranthesis?

您可以在此处找到我的实施的代码示例:http://3v4l.org/5mPDp

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

要计算新的标准偏差,您需要同时使用旧的和新的平均值;这会给你Welford's method

function sd_reverse($s, $n, $x, $mean, $old_mean) {
    return sqrt( 1 / $n * ( ( $n - 1 ) * pow( $s, 2 ) + ( $x - $mean )*( $x - $old_mean ) ) );
}

你可以在这里找到一个非常易读的C ++运行平均值,方差和标准差的实现:http://www.johndcook.com/standard_deviation.html