Estendere il paradosso del compleanno a più di 2 persone


29

Nel tradizionale paradosso del compleanno, la domanda è "quali sono le probabilità che due o più persone in un gruppo di persone condividano un compleanno". Sono bloccato su un problema che è un'estensione di questo.n

Invece di conoscere la probabilità che due persone condividano un compleanno, ho bisogno di estendere la domanda per sapere qual è la probabilità che o più persone condividano un compleanno. Con puoi farlo calcolando la probabilità che due persone non condividano un compleanno e lo sottraggano da , ma non credo di poter estendere questa logica a un numero maggiore di .x = 2 1 xxx=21x

Per complicare ulteriormente questo, ho anche bisogno di una soluzione che funzionerà per numeri molto grandi per (milioni) e (migliaia).xnx


1
Presumo che sia un problema di bioinformatica
csgillespie,

3
In realtà è un problema di bioinformatica, ma dal momento che si riduce allo stesso concetto del paradosso del compleanno, ho pensato di salvare i dettagli irrilevanti!
Simon Andrews,

4
Normalmente sarei d'accordo con te, ma in questo caso i dettagli potrebbero essere importanti dal momento che potrebbe esserci già un pacchetto bioconduttore che fa quello che chiedi.
csgillespie,

Se vuoi davvero saperlo, è un problema di ricerca di schemi in cui sto cercando di stimare con precisione la probabilità di un dato livello di arricchimento di una sottosequenza all'interno di una serie di sequenze più grandi. Ho quindi una serie di sottosequenze con conteggi associati e so quante sottosequenze ho osservato e quante sequenze teoricamente osservabili sono disponibili. Se ho visto una sequenza particolare 10 volte su 10.000 osservazioni, devo sapere quanto è probabile che si sia verificato per caso.
Simon Andrews,

Quasi otto anni dopo, ho pubblicato una risposta a questo problema su stats.stackexchange.com/questions/333471 . Il codice lì non funziona per grande , però, perché richiede tempo quadratico in n . n,n
whuber

Risposte:


17

Questo è un problema di conteggio: ci sono possibili assegnazioni di b compleanni a n persone. Di questi, sia q ( k ; n , b ) il numero di incarichi per i quali nessun compleanno è condiviso da più di k persone ma almeno un compleanno è effettivamente condiviso da k persone. La probabilità che cerchiamo può essere trovata sommando q ( k ; n , b ) per i valori appropriati di k e moltiplicando il risultato per b - n .bnbnq(k;n,b)kkq(k;n,b)kbn

Questi conteggi possono essere trovati esattamente per valori di inferiori a diverse centinaia. Tuttavia, non seguiranno alcuna formula semplice: dobbiamo considerare gli schemi dei modi in cui i compleanni possono essere assegnati . Lo illustrerò al posto di fornire una dimostrazione generale. Sia n = 4 (questa è la più piccola situazione interessante). Le possibilità sono:nn=4

  • Ogni persona ha un compleanno unico; il codice è {4}.
  • Esattamente due persone condividono un compleanno; il codice è {2,1}.
  • Due persone hanno un compleanno e le altre due ne hanno un altro; il codice è {0,2}.
  • Tre persone condividono un compleanno; il codice è {1,0,1}.
  • Quattro persone condividono un compleanno; il codice è {0,0,0,1}.

In generale, il codice è una tupla di conteggi cui k th stipula elemento quanti di nascita distinti sono condivisi da esattamente k persone. Pertanto, in particolare,{a[1],a[2],}kthk

1a[1]+2a[2]+...+ka[k]+=n.

Si noti, anche in questo semplice caso, che ci sono due modi in cui si raggiunge il massimo di due persone per compleanno: uno con il codice e un altro con il codice { 2 , 1 } .{0,2}{2,1}

Possiamo contare direttamente il numero di possibili incarichi di compleanno corrispondenti a un determinato codice. Questo numero è il prodotto di tre termini. Uno è un coefficiente multinomiale; conta il numero di modi di partizionamento persone in un [ 1 ] gruppi di 1 , una [ 2 ] gruppi di 2 , e così via. Poiché la sequenza di gruppi non ha importanza, dobbiamo dividere questo coefficiente multinomiale per un [ 1 ] ! a [ 2 ] ! na[1]1a[2]2a[1]!a[2]!; il suo reciproco è il secondo termine. Infine, allinea i gruppi e assegnali a ciascuno un compleanno: ci sono candidati per il primo gruppo, b - 1 per il secondo e così via. Questi valori devono essere moltiplicati insieme, formando il terzo termine. È uguale al "prodotto fattoriale" b ( a [ 1 ] + a [ 2 ] + ) dove b ( m ) significa b ( b - 1 ) ( b - m + 1bb1b(a[1]+a[2]+)b(m) .b(b1)(bm+1)

Esiste una ricorsione ovvia e abbastanza semplice relativa al conteggio per un modello al conteggio per il modello { a [ 1 ] , ... , a [ k - 1 ] } . Ciò consente un rapido calcolo dei conteggi per valori modesti di n . In particolare, un [ k ] rappresenta un [ k ] date di nascita condivise esattamente da k{a[1],,a[k]}{a[1],,a[k1]}na[k]a[k]kpersone ciascuno. Dopo questi gruppi di k persone sono state tratte dai n persone, che può essere fatto in x modi distinti (ad esempio), resta da contare il numero di modi di raggiungere il modello { un [ 1 ] , ... , un [ k - 1 ] } tra le persone rimanenti. Moltiplicando questo per x si ottiene la ricorsione.a[k]knx{a[1],,a[k1]}x

Dubito che esista una formula in forma chiusa per , che si ottiene sommando i conteggi per tutte le partizioni di n il cui termine massimo è uguale a k . Lasciami offrire alcuni esempi:q(k;n,b)nk

Con (cinque possibili compleanni) e n = 4 (quattro persone), otteniamob=5n=4

q(1)=q(1;4,5)=120q(2)=360+60=420q(3)=80q(4)=5.

Di conseguenza, ad esempio, la possibilità che tre o più persone su quattro condividano lo stesso "compleanno" (su possibili date) è uguale a ( 80 + 5 ) / 625 = 0,136 .5(80+5)/625=0.136

Come altro esempio, prendi e n = 23 . Ecco i valori di q ( k ; 23 , 365 ) per il più piccolo k (solo a sei segni):b=365n=23q(k;23,365)k

k=1:0.49270k=2:0.494592k=3:0.0125308k=4:0.000172844k=5:1.80449E6k=6:1.48722E8k=7:9.92255E11k=8:5.45195E13.

Usando questa tecnica, possiamo facilmente calcolare che esiste circa il 50% di probabilità di (almeno) una collisione a tre vie di compleanno tra 87 persone, una probabilità del 50% di una collisione a quattro vie tra 187 e una probabilità del 50% di una collisione a cinque vie tra 310 persone. L'ultimo calcolo inizia impiegando alcuni secondi (in Mathematica, comunque) perché il numero di partizioni da considerare inizia a crescere. Per sostanzialmente più grandi abbiamo bisogno di un'approssimazione.n

Un'approssimazione si ottiene per mezzo della distribuzione di Poisson con aspettativa , perché possiamo vedere un incarico di compleanno come derivante da b variabili di Poisson quasi (ma non del tutto) indipendenti ciascuna con aspettativa n / b : la variabile per ogni dato compleanno possibile descrive quante delle n persone hanno quel compleanno. La distribuzione del massimo è quindi approssimativamente F ( k ) b dove F è il CDF di Poisson. Questo non è un argomento rigoroso, quindi facciamo un piccolo test. L'approssimazione per n = 23 , bn/bbn/bnF(k)bFn=23b=365

k=1:0.498783k=2:0.496803k=3:0.014187k=4:0.000225115.

Confrontando con il precedente si può vedere che le probabilità relative possono essere scarse quando sono piccole, ma le probabilità assolute sono ragionevolmente ben approssimate a circa lo 0,5%. Test con una vasta gamma di e b suggerisce l'approssimazione è solitamente circa questo bene.nb

To wrap up, let's consider the original question: take n=10,000 (the number of observations) and b=1000000 (the number of possible "structures," approximately). The approximate distribution for the maximum number of "shared birthdays" is

k=1:0k=2:0.8475+k=3:0.1520+k=4:0.0004+k>4:<1E6.

(This is a fast calculation.) Clearly, observing one structure 10 times out of 10,000 would be highly significant. Because n and b are both large, I expect the approximation to work quite well here.

Incidentally, as Shane intimated, simulations can provide useful checks. A Mathematica simulation is created with a function like

simulate[n_, b_] := Max[Last[Transpose[Tally[RandomInteger[{0, b - 1}, n]]]]];

which is then iterated and summarized, as in this example which runs 10,000 iterations of the n=10000, b=1000000 case:

Tally[Table[simulate[10000, 1000000], {n, 1, 10000}]] // TableForm

Its output is

2 8503

3 1493

4 4

These frequencies closely agree with those predicted by the Poisson approximation.


What a fantastic answer, thank you very much @whuber.
JKnight

"There is an obvious and fairly simple recursion" — Namely?
Kodiologist

1
@Kodiologist I inserted a brief description of the idea.
whuber

+1 but where in the original question did you see that n=10000 and b=1mln? The OP looks like it is asking about n=1mln and k=10000, with b unspecified (presumably b=365). Not that it matters at this point :)
amoeba says Reinstate Monica

1
@amoeba After all this time (six years, 1600 answers, and closely reading tens of thousands of posts) I cannot recall, but most likely I misinterpreted the last line. In my defense, note that if we read it literally the answer is immediate (upon applying a version of the Pigeonhole Principle): it is certain that among n=millions of people there will be at least one birthday that is shared among at least x=thousands of them!
whuber

2

It is always possible to solve this problem with a monte-carlo solution, although that's far from the most efficient. Here's a simple example of the 2 person problem in R (from a presentation I gave last year; I used this as an example of inefficient code), which could be easily adjusted to account for more than 2:

birthday.paradox <- function(n.people, n.trials) {
    matches <- 0
    for (trial in 1:n.trials) {
        birthdays <- cbind(as.matrix(1:365), rep(0, 365))
        for (person in 1:n.people) {
            day <- sample(1:365, 1, replace = TRUE)
            if (birthdays[birthdays[, 1] == day, 2] == 1) {
                matches <- matches + 1
                break
            }
            birthdays[birthdays[, 1] == day, 2] <- 1
        }
        birthdays <- NULL
    }
    print(paste("Probability of birthday matches = ", matches/n.trials))
}

I am not sure if the multiple types solution will work here.

I think that generalisation still only works for 2 or more people sharing a birthday - just that you can have different sub-classes of people.
Simon Andrews

1

This is an attempt at a general solution. There may be some mistakes so use with caution!

First some notation:

P(x,n) be the probability that x or more people share a birthday among n people,

P(y|n) be the probability that exactly y people share a birthday among n people.

Notes:

  1. Abuse of notation as P(.) is being used in two different ways.

  2. By definition y cannot take the value of 1 as it does not make any sense and y = 0 can be interpreted to mean that no one shares a common birthday.

Then the required probability is given by:

P(x,n)=1P(0|n)P(2|n)P(3|n)....P(x1|n)

Now,

P(y|n)=(ny)(365365)y k=1k=ny(1k365)

Here is the logic: You need the probability that exactly y people share a birthday.

Step 1: You can pick y people in (ny) ways.

Step 2: Since they share a birthday it can be any of the 365 days in a year. So, we basically have 365 choices which gives us (365365)y.

Step 3: The remaining ny people should not share a birthday with the first y people or with each other. This reasoning gives us k=1k=ny(1k365).

You can check that for x = 2 the above collapses to the standard birthday paradox solution.


Will this solution suffer from the curse of dimensionality? If instead of n=365, n=10^6 is this solution still feasible?
csgillespie

Some approximations may have to be used to deal with high dimensions. Perhaps, use Stirling's approximation for factorials in the binomial coefficient. To deal with the product terms you could take logs and compute the sums instead of the products and then take the anti-log of the sum.

There are also several other forms of approximations possible using for example the Taylor series expansion for the exponential function. See the wiki page for these approximations: en.wikipedia.org/wiki/Birthday_problem#Approximations

Suppose y=2, n=4, and there are just two birthdays. Your formula, adapted by replacing 365 by 2, seems to say the probability that exactly 2 people share a birthday is Comb(4,2)*(2/2)^2*(1-1/2)*(1-2/2) = 0. (In fact, it's easy to see--by brute force enumeration if you like--that the probabilities that 2, 3, or 4 people share a "birthday" are 6/16, 8/16, and 2/16, respectively.) Indeed, whenever n-y >= 365, your formula yields 0, whereas as n gets large and y is fixed the probability should increase to a non-zero maximum before n reaches 365*y and then decrease, but never down to 0.
whuber

Why you are replacing 365 by n? The probability that 2 people share a birthday is computed as: 1 - Prob(they have unique birthday). Prob(that they have unique birthday) = (364/365). The logic is as follows: Pick a person. This person can have any day of the 365 days as a birthday. The second person can then only have a birthday on one of the remaining 364 days. Thus, the prob that they have a unique birthday is 364/365. I am not sure how you are calculating 6/16.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.