来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
任何帮助表示赞赏!
答案 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