재귀 적으로 확률을 계산하십시오.
를 멤버 의 모집단에서 항목 의 모든 독립 드로우 에서 정확하게 값 가 선택 될 확률로 하자 . ( 분석 기간 동안 과 고정하고 명시 적으로 언급하지 않아도됩니다.)ps(x)x0≤x≤ks≥1kn≥k>0nk
하자 정확히 경우 확률 될 값은 처음에 선택 무, 다음 중은 마지막 무승부로 선택됩니다. 그런 다음 요소 의 요소에 대한 하위 집합이 있고 나머지 요소 의 하위 집합 이 인구 의 다른 구성원과 별도로 선택 되므로,ps(x∣y)ys−1x≤y(yx)xy(n−yk−x)k−xn−y
ps(x∣y)=(yx)(n−yk−x)(nk).
총 확률 법칙
ps(x)=∑y=xkps(x∣y)ps−1(y).
들면 , 그것은 확실성의 이 개시 분포이다.s=1x=k
반복 을 통해 전체 분포를 얻는 데 필요한 총 계산 은 입니다. 합리적으로 빠를뿐만 아니라 알고리즘도 쉽습니다. 위험한 프로그래머를 기다리는 한 가지 함정은 이러한 확률이 매우 작고 언더 플로 부동 소수점 계산이 될 수 있다는 것입니다. 다음 구현은 배열 열 에서 값을 계산하여이를 방지합니다 .sO(k2s)R
log(ps(x))1,2,…,s
lp <- function(s, n, k) {
P <- matrix(NA, nrow=k+1, ncol=s, dimnames=list(0:k, 1:s))
P[, 1] <- c(rep(-Inf, k), 0)
for (u in 2:s)
for (i in 0:k) {
q <- P[i:k+1, u-1] + lchoose(i:k, i) + lchoose(n-(i:k), k-i) - lchoose(n, k)
q.0 <- max(q, na.rm=TRUE)
P[i+1, u] <- q.0 + log(sum(exp(q - q.0)))
}
return(P)
}
p <- function(...) zapsmall(exp(lp(...)))
질문에 대한 답변은 및 을 통해 얻습니다 . s=5, n=10000=104k=100=102 출력은 배열이지만 대부분의 숫자는 너무 작아서 매우 작은 에 집중할 수 있습니다 . 해당하는 처음 네 개의 행은 다음과 같습니다 .101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
출력은
1 2 3 4 5
0 0 0.3641945 0.9900484 0.9999 0.999999
1 0 0.3715891 0.0099034 0.0001 0.000001
2 0 0.1857756 0.0000481 0.0000 0.000000
3 0 0.0606681 0.0000002 0.0000 0.000000
값은 행에 레이블을 지정하고 값은 열에 레이블을 지정합니다. 5 열은 5 개 샘플 모두에 하나의 요소가 나타날 가능성이 적고 (약 100 만 개) 5 개 샘플 모두에 2 개 이상의 요소가 나타날 가능성은 없습니다.xs
이러한 기회가 얼마나 작은 지 보려면 해당 로그를보십시오. 10 진법은 편리하며 많은 숫자가 필요하지 않습니다.
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
출력은 소수점 뒤에 몇 개의 0이 있는지 알려줍니다.
1 2 3 4 5 6 7 8 9 10 ... 97 98 99 100
6.0 12.3 18.8 25.5 32.3 39.2 46.2 53.2 60.4 67.6 ... 917.0 933.0 949.0 967.0
맨 위 행의 숫자는 값입니다 . 예를 들어, 모든 5 개 개의 샘플에 표시 정확히 3 값의 기회는 계산에 의해 발견 주고, 실제로이있다 전과 0을 첫 번째 유효 숫자. 수표로, 마지막 값 의 둥근 버전 . (첫 번째 샘플이 다음 네 샘플에 다시 나타날 가능성을 계산)은xexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.