(이 접근 방식은 게시 한 솔루션을 포함하여 게시 된 다른 솔루션과 독립적이므로 별도의 응답으로 제공하고 있습니다).
p의 합이 작은 경우 정확한 분포를 초 단위 (또는 그 이하)로 계산할 수 있습니다.
우리는 이미 분포가 대략 가우스 (일부 시나리오에서는)이거나 포아송 (다른 시나리오에서는) 일 수 있다는 제안을 보았습니다. 어느 쪽이든, 우리는 평균 가 의 합이고 분산 가 의 합 임을 알고 있습니다. 따라서 분포는 평균의 몇 가지 표준 편차, 즉 가 4에서 6 사이 인 SD 또는 그 주변에 집중됩니다 . 따라서 우리는 합 확률을 계산할 필요는 (정수)과 동일 위한 내지 . 대부분이μpiσ2pi(1−pi)zzXkk=μ−zσk=μ+zσpi작고, 는 와 거의 같지만 (약간 작음) 보수적으로 우리는 간격으로 계산을 수행 할 수 있습니다 . 예를 들어, 의 합 이 와 같고 꼬리를 잘 덮기 위해 을 선택하면 에서 를 포함하는 계산이 필요합니다. = , 이는 단지 28 값입니다.σ2μk[μ−zμ−−√,μ+zμ−−√]pi9z=6k[9−69–√,9+69–√][0,27]
분포는 재귀 적으로 계산됩니다 . 를이 Bernoulli 변수 의 첫 번째 의 합의 분포라고 합시다 . 임의의 경우 에서 으로 첫 번째의 총합 변수와 동일 할 수 두 개의 상호 배타적 인 방법 : 제의 합계 변수가 동일 상기 인 그렇지 않으면 첫 번째 변수 의 합 은 과 같고 는 입니다. 따라서fiij0i+1i+1jiji+1st0ij−1i+1st1
fi+1(j)=fi(j)(1−pi+1)+fi(j−1)pi+1.
에서 까지의 간격으로 적분 에 대해서만이 계산을 수행하면j max(0,μ−zμ−−√) μ+zμ−−√.
대부분의 가 때 (그러나 는 여전히 과 합리적인 정밀도로 구별 가능합니다 ),이 접근법은 이전에 게시 한 솔루션에 사용 된 부동 소수점 반올림 오류가 크게 누적되어 있지 않습니다. 따라서 확장 정밀도 계산이 필요하지 않습니다. 예를 들어, 확률 의 배열에 대한 배정 밀도 계산 ( , 과 사이의 합의 확률에 대한 계산 필요pi1−pi1216pi=1/(i+1)μ=10.6676031)는 Mathematica 8에서 0.1 초, Excel 2002에서 1-2 초가 걸렸습니다 (둘 다 같은 답을 얻었습니다). 4 배 정밀도 (Mathematica에서)로 반복하는 데 약 2 초가 걸렸지 만 이상 응답을 변경하지 않았습니다 . SD에서 상단 꼬리로 의 분포를 종료하면 총 확률의 만 손실되었습니다 .3×10−15z=63.6×10−8
0과 0.001 ( ) 사이의 40,000 배정 밀도 무작위 값의 배열에 대한 또 다른 계산은 Mathematica에서 0.08 초가 걸렸습니다.μ=19.9093
이 알고리즘은 병렬화 가능합니다. 다만 세트 침입 대략 동일한 크기의 프로세서 당 하나의 분리 된 서브 세트들로. 각 부분 집합에 대한 분포를 계산 한 다음 전체 답을 얻기 위해 결과를 축소합니다 (원하는 경우 FFT 사용). 따라서 가 커지거나 꼬리를 멀리보아야 할 때 ( 크게) 이 큰 경우에도 사용하는 것이 실용적 입니다.piμzn
프로세서 가있는 변수 배열의 타이밍은 됩니다. Mathematica의 속도는 초당 백만 정도입니다. 예를 들어, 프로세서 인 경우, 변동, 총 확률 이고 상단 꼬리 에 대한 표준 편차로 나갑니다. 만 : 몇 초의 컴퓨팅 시간을 계산합니다. 이것을 컴파일하면 성능을 2 배 빠르게 높일 수 있습니다.nmO(n(μ+zμ−−√)/m)m=1n=20000μ=100z=6n(μ+zμ−−√)/m=3.2
또한,이 테스트 사례에서 분포 그래프는 약간의 양의 왜도를 분명히 나타 냈습니다. 정상이 아닙니다.
기록을 위해 다음은 Mathematica 솔루션입니다.
pb[p_, z_] := Module[
{\[Mu] = Total[p]},
Fold[#1 - #2 Differences[Prepend[#1, 0]] &,
Prepend[ConstantArray[0, Ceiling[\[Mu] + Sqrt[\[Mu]] z]], 1], p]
]
( NB 이 사이트에서 적용한 컬러 코딩은 Mathematica 코드에는 의미가 없습니다. 특히 회색 부분은 주석 이 아닙니다 : 모든 작업이 완료된 곳입니다!)
사용 예는 다음과 같습니다.
pb[RandomReal[{0, 0.001}, 40000], 8]
편집하다
R
솔루션 10 배 느린보다 티카 아마도 내가 최적를 구분하지 않은 - -이 테스트 케이스하지만 여전히 (일초에 대해) 신속하게 실행 :
pb <- function(p, z) {
mu <- sum(p)
x <- c(1, rep(0, ceiling(mu + sqrt(mu) * z)))
f <- function(v) {x <<- x - v * diff(c(0, x));}
sapply(p, f); x
}
y <- pb(runif(40000, 0, 0.001), 8)
plot(y)