변수 파티션의 분산을 계산하는 방법


15

나는 (독립적 인) 샘플을 병렬로 수집하는 실험을 실행하고 있으며 각 샘플 그룹의 분산을 계산 한 다음 모든 샘플을 합하여 모든 샘플의 총 분산을 찾고 싶습니다.

용어가 확실하지 않기 때문에 이에 대한 파생물을 찾는 데 어려움을 겪고 있습니다. 나는 그것을 하나의 RV의 파티션으로 생각합니다.

따라서 , , ... 및 에서 를 찾고 싶습니다 . 여기서 X = [X_1, X_2, \ dots, X_n] 입니다.Var(X)Var(X1)Var(X2)Var(Xn)X[X1,X2,,Xn]

편집 : 파티션의 크기 / 카디널리티는 같지 않지만 파티션 크기의 합은 전체 샘플 세트의 샘플 수와 같습니다.

편집 2 : 병렬 계산에 대한 공식이 여기 에 있지만, 세트가 아닌 두 세트로 파티션의 경우 만 다룹니다 .n


이것은 내 질문과 동일합니까? mathoverflow.net/questions/64120/…

마지막 대괄호는 무엇을 의미합니까? "총 분산"이란 무엇입니까? 결합 된 데이터 세트의 분산 이외의 것이 있습니까?
whuber

@whuber 마지막 ​​브라켓은? "총 분산"은 총 데이터 집합의 분산을 의미합니다.
갈라 민

표현 은 많은 것을 의미 할 수 있습니다 (전통적으로 벡터 임에도 불구하고). 나는 설명을 찾고있었습니다. [X1,X2,,Xn]
whuber

답변:


22

모든 서브 샘플의 샘플 크기가 같으면 수식이 매우 간단합니다. 만약 가지고 있다면 사이즈의 서브 - 샘플 K를 (총 g의 k 개의 샘플), 그 결합 된 샘플의 분산 평균에 따라 E의 J 및 변동 V의 J 각 서브 샘플 : V R을 ( X 1 , , X g k ) = k 1gkgkEjVjVR(E의J)시료의 분산 수단을 의미한다.

Var(X1,,Xgk)=k1gk1(j=1gVj+k(g1)k1Var(Ej)),
Var(Ej)

R의 데모 :

> x <- rnorm(100)
> g <- gl(10,10)
> mns <- tapply(x, g, mean)
> vs <- tapply(x, g, var)
> 9/99*(sum(vs) + 10*var(mns))
[1] 1.033749
> var(x)
[1] 1.033749

표본 크기가 같지 않으면 수식이 그리 좋지 않습니다.

편집 : 동일하지 않은 샘플 크기에 대한 공식

이 경우 서브 샘플 각각 k 개의 J , J = 1 , ... , g의 총 요소 N = Σ k 개의 J의 값은, 다음 V 형 R은 ( X 1 , ... , X N ) = 1gkj,j=1,,gn=kj 여기서 ˉ X =( g j = 1 kj ˉ X j)/n은 모든 평균의 가중 평균 (모든 값의 평균과 동일)입니다.

Var(X1,,Xn)=1n1(j=1g(kj1)Vj+j=1gkj(X¯jX¯)2),
X¯=(j=1gkjX¯j)/n

다시 한 번 시연 :

> k <- rpois(10, lambda=10)
> n <- sum(k)
> g <- factor(rep(1:10, k))
> x <- rnorm(n)
> mns <- tapply(x, g, mean)
> vs <- tapply(x, g, var)
> 1/(n-1)*(sum((k-1)*vs) + sum(k*(mns-weighted.mean(mns,k))^2))
[1] 1.108966
> var(x)
[1] 1.108966

(XjiX¯)2X¯j[(XjiX¯j)(X¯jX¯)]2


감사. 불행히도, 나는 파티션의 크기가 모두 같은 것을 보장 할 수 없습니다. 각 파티션의 분산을 병렬로 계산 한 다음 결국 결합 해야하는 대규모 병렬 프로세스를 실행하고 있지만 각 병렬 프로세스의 결과 / 샘플은 동일하지 않습니다 (수신 된 광자의 Monte Carlo 시뮬레이션입니다).
갈라 민

3
데이터웨어 하우스 환경에서 병렬 계산을위한 매우 유용한 공식을 +1 할 수 없습니다.
Noah Yetter

1

이것은 단순히 파생의 대략적인 스케치와 파이썬 코드 로 aniko답변 에 추가 된 것이므로 모든 크레딧은 aniko로 이동합니다.

유도

XjX={X1,X2,,Xg}gkj=|Xj|

Ej=E[Xj]=1kji=1kjXjiVj=Var[Xj]=1kj1i=1kj(XjiEj)2
n=j=1gkj
Var[X]=1n1j=1gi=1kj(XjiE[X])2=1n1j=1gi=1kj((XjiEj)(E[X]Ej))2=1n1j=1gi=1kj(XjiEj)22(XjiEj)(E[X]Ej)+(E[X]Ej)2=1n1j=1g(kj1)Vj+kj(E[X]Ej)2.
If we have the same size k for each part, i.e. j:kj=k, above formula simplifies to
Var[X]=1n1j=1g(k1)Vj+k(g1)Var[Ej]=k1n1j=1gVj+k(g1)k1Var[Ej]

python code

The following python function works for arrays that have been splitted along the first dimension and implements the "more complex" formula for differently sized parts.

import numpy as np

def combine(averages, variances, counts, size=None):
    """
    Combine averages and variances to one single average and variance.

    # Arguments
        averages: List of averages for each part.
        variances: List of variances for each part.
        counts: List of number of elements in each part.
        size: Total number of elements in all of the parts.
    # Returns
        average: Average over all parts.
        variance: Variance over all parts.
    """
    average = np.average(averages, weights=counts)

    # necessary for correct variance in case of multidimensional arrays
    if size is not None:
        counts = counts * size // np.sum(counts, dtype='int')

    squares = (counts - 1) * variances + counts * (averages - average)**2
    return average, np.sum(squares) / (size - 1)

It can be used as follows:

# sizes k_j and n
ks = np.random.poisson(10, 10)
n = np.sum(ks)

# create data
x = np.random.randn(n, 20)
parts = np.split(x, np.cumsum(ks[:-1]))

# compute statistics on parts
ms = [np.mean(p) for p in parts]
vs = [np.var(p, ddof=1) for p in parts]

# combine and compare
combined = combine(ms, vs, ks, x.size)
numpied = np.mean(x), np.var(x, ddof=1)
distance = np.abs(np.array(combined) - np.array(numpied))
print('combined --- mean:{: .9f} - var:{: .9f}'.format(*combined))
print('numpied  --- mean:{: .9f} - var:{: .9f}'.format(*numpied))
print('distance --- mean:{: .5e} - var:{: .5e}'.format(*distance))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.