2014-04-30 4 views
0

출현 from this question on Math SE 다음과 같은 경우가 있습니다. 임의의 값으로 세트 ($array)가있다원래 모집단을 모르는 경우 어떻게 새로운 표준 편차를 계산합니까?

는 세트 ($n)의 값의 크기는, 그것이 ($mean) 평균 및 표준 편차 ($s)이다. sd() 기능을 가지고

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

PHP comments for the stats_standard_deviation() function에 Origin의 :

// 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

경우 오프별로 하나? – 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++ 구현을 찾을 수 있습니다

: 당신은 어떻게 sd_reverse``입력 어쩌면 하나를 호출하는 http://www.johndcook.com/standard_deviation.html

+0

놀라운. 감사! –