2014-04-30 24 views
0

即將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()函數不會。任何人都可以弄清楚,我做錯了什麼?也許不適當使用palenthesis?

你可以在這裏找到我的實現的代碼示例:http://3v4l.org/5mPDp

任何幫助表示讚賞!

+0

你是如何調用'sd_reverse'的投入也許有過,如果按一個? – Halcyon

+0

我相信最後的$ x- $ mean應該平方。 – Teepeemm

+0

@Halcyon你可以在這裏查看整個代碼:http://3v4l.org/5mPDp –

回答

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

+0

令人驚歎。謝謝! –