Bu ünlü Doğum Günü Sorununun bir genellemesidir : d = 6 olasılık kümesi arasında rastgele, eşit olarak dağıtılmış "doğum günleri" olan n=100 kişi göz önüne alındığında , hiçbir doğum gününün m = 20'den fazla kişi tarafından paylaşılma şansı nedir?d=6m=20
Kesin bir hesaplama 0.267 cevabını verir (iki kat hassasiyetle). Teoriyi çizeceğim ve genel n , m , d için kod vereceğim . Kodun asimptotik zamanlaması O ( n 2 log ( d ) ) ' dir ve bu da onu çok sayıda doğum günü d için uygun hale getirirve n binlerceyekadar makul performans sağlar. Bu noktada, Poisson yaklaşımı, doğum günü paradoksunu 2'den fazla kişiye genişletme konusundatartışıldı,çoğu durumda iyi çalışmalıdır.0.267747907805267n,m,d.O(n2log(d))dn
Çözüm açıklaması
D- taraflı bir kalıbın bağımsız merdanesinin sonuçları için olasılık oluşturma fonksiyonu (pgf)nd
d−nfn(x1,x2,…,xd)=d−n(x1+x2+⋯+xd)n.
Katsayısı Bu multinomial genişlemesi karşılaştıkları hangi yollarla sayısını verir i tam görünebilir e i , kat i = 1 , 2 , ... , d .xe11xe22⋯xeddieii=1,2,…,d.
En fazla bizim ilgi sınırlandırılması herhangi yüze göre görünüşe değerlendirilmesi için eşit olduğunu f n idealdir modulo I tarafından üretilen x m + 1 1 , x m + 1 2 , ... , x m + 1 d . Bu değerlendirmeyi yapmak için Binom Teoremini tekrar tekrar kullanın.mfnIxm+11,xm+12,…,xm+1d.
fn( x1, … , Xd)= ( ( x1+ ⋯ + xr) + ( xr + 1+ xr + 2+ ⋯ + x2 r) )n= ∑k = 0n( nk) (x1+ ⋯ + xr)k( xr + 1+ ⋯ + x2 r)n - k= ∑k = 0n( nk) fk( x1, … , Xr) fn - k( xr + 1, … , X2 r)
zaman ve eşitlenir. Yazma f ( d ) n = f n ( 1 , 1 , ... , 1 ) ( d terimleri), elimizdekid= 2 rf( d)n= fn( 1 , 1 , … , 1 )d
f( 2 r )n= ∑k = 0n( nk) f( r )kf( r )n - k.(A)
Tüm garip, benzer bir ayrışma kullanımıd= 2 r + 1
fn( x1, … , Xd)= ( ( x1+ ⋯ + x2 r) + x2 r + 1)n= ∑k = 0n( nk) fk( x1, … , X2 r) fn - k( x2 r + 1) ,
vererek
f( 2 r + 1 )n= ∑k = 0n( nk) f( 2 r )kf( 1 )n - k.(B)
Her iki durumda da, modulo olan her şeyi azaltabiliriz.ben
fn( xj) ≅{ xn0n ≤ mn > mşıkben,
özyineleme için başlangıç değerlerinin sağlanması,
f( 1 )n= { 10n ≤ mn > m
Bunu etkili kılan, değişkenlerini her biri eşit büyüklükte iki r değişken grubuna bölerek ve tüm değişken değerlerini 1 olarak ayarlayarak , her şeyi bir grup için sadece bir kez değerlendirip sonuçları birleştirmemizdir. Bu , her biri kombinasyon için O ( n ) hesaplamasına ihtiyaç duyan n + 1 terimine kadar hesaplama gerektirir . Hatta saklamak için bir 2D dizi gerekmez f ( r ) N , hesaplanırken için f ( d ) N , sadece fdr1 ,n + 1O ( n )f( r )nf( d)n, vef ( 1 ) n gereklidir.f( r )nf( 1 )n
Toplam adım sayısı, nin ikili genişlemesindeki basamak sayısından (bu, formül ( a ) ' daki bölünmeleri eşit gruplara sayar ) artı genişlemedeki sayıların sayısından (her seferinde tek sayılan) ( b ) ) formülünün uygulanmasını gerektiren değerle karşılaşılır . Bu hala sadece O ( log ( d ) ) adımları.d( a )( b )O ( günlük( d) )
In R
bir on yıllık iş istasyonu üzerinde çalışmak 0.007 saniyede yapıldı. Kod, bu yazının sonunda listelenir. Olası taşmaları veya çok fazla taşmayı biriktirmemek için olasılıkların yerine olasılıkların logaritmasını kullanır. Bu , çözümdeki faktörünün çıkarılmasını mümkün kılar , böylece olasılıkların altında yatan sayıları hesaplayabiliriz.d- n
Bu prosedürün , olasılıklarının tümünün aynı anda hesaplanmasıyla sonuçlandığını ve bu da şansın n ile nasıl değiştiğini kolayca incelememizi sağlar .f0, f1, … , Fnn
Uygulamalar
Genelleştirilmiş Doğum Günü Sorunundaki dağılım, fonksiyon tarafından hesaplanır tmultinom.full
. Tek zorluk, bir çarpışma şansının çok büyük hale gelmesinden önce mevcut olması gereken insan sayısı için bir üst sınır bulmaktır. Aşağıdaki kod bunu küçük n ile başlayan ve yeterince büyük olana kadar iki katına çıkaran kaba kuvvetle yapar . Bütün hesaplanması, bu yüzden alır O ( n, 2 günlük ( n ) giriş ( d ) ) bir zaman burada n bir çözümdür. Aracılığıyla halkın sayılar için olasılıkların tüm dağıtım yukarı n hesaplanır.m + 1nO ( n2günlük( n ) günlük( d) )nn
#
# The birthday problem: find the number of people where the chance of
# a collision of `m+1` birthdays first exceeds `alpha`.
#
birthday <- function(m=1, d=365, alpha=0.50) {
n <- 8
while((p <- tmultinom.full(n, m, d))[n] > alpha) n <- n * 2
return(p)
}
Örnek olarak, bir kalabalığın hesaplamada bulunan en az sekizinin doğum gününü paylaşma olasılığından daha fazla olması için gereken minimum kişi sayısı . Sadece birkaç saniye sürüyor. İşte çıktının bir parçası:798birthday(7)
Bu sorunun özel bir sürümü , doğum günü paradoksunu 2'den fazla kişiye genişletme konusunda ele alınmıştır, bu da çok sayıda haddelenmiş taraflı bir kalıp vakasıyla ilgilidir .365
kod
# Compute the chance that in `n` independent rolls of a `d`-sided die,
# no side appears more than `m` times.
#
tmultinom <- function(n, m, d, count=FALSE) tmultinom.full(n, m, d, count)[n+1]
#
# Compute the chances that in 0, 1, 2, ..., `n` independent rolls of a
# `d`-sided die, no side appears more than `m` times.
#
tmultinom.full <- function(n, m, d, count=FALSE) {
if (n < 0) return(numeric(0))
one <- rep(1.0, n+1); names(one) <- 0:n
if (d <= 0 || m >= n) return(one)
if(count) log.p <- 0 else log.p <- -log(d)
f <- function(n, m, d) { # The recursive solution
if (d==1) return(one) # Base case
r <- floor(d/2)
x <- double(f(n, m, r), m) # Combine two equal values
if (2*r < d) x <- combine(x, one, m) # Treat odd `d`
return(x)
}
one <- c(log.p*(0:m), rep(-Inf, n-m)) # Reduction modulo x^(m+1)
double <- function(x, m) combine(x, x, m)
combine <- function(x, y, m) { # The Binomial Theorem
z <- sapply(1:length(x), function(n) { # Need all powers 0..n
z <- x[1:n] + lchoose(n-1, 1:n-1) + y[n:1]
z.max <- max(z)
log(sum(exp(z - z.max), na.rm=TRUE)) + z.max
})
return(z)
}
x <- exp(f(n, m, d)); names(x) <- 0:n
return(x)
}
Cevap şu şekilde elde edilir:
print(tmultinom(100,20,6), digits=15)
,267747907805267