Question:
Probabilité de gagner une compétition K jeux meilleur de la série de N jeux
Nitro
2020-04-06 00:00:27 UTC
view on stackexchange narkive permalink

Pensez à une série «best of 5» dans les sports / compétition où la première équipe à gagner 3 matchs remporte la série. Donc N = 5, K = 3. Où probabilité w = p (partie gagnante de l'équipe A) et l = p (partie perdante de l'équipe A) . Supposons que ces probabilités ne changent pas au cours de la série.

Quand j'ai pensé à cela pour la première fois, j'ai essayé par erreur d'ajouter les probabilités individuelles de gagner des matchs 3/3, 3/4 et 3/5:

  faux = fonction (w) {
  p = dbinom (3,3, w) + dbinom (3,4, w) + dbinom (3,5, w)
  retour (p)
}

faux (.9)
# 1.0935
 

De toute évidence, le problème est qu'il y a redondance puisque 3 victoires d'affilée, W-W-W rend les résultats des jeux 4 et 5 obsolètes. c'est-à-dire que W-W-W-L-W et W-W-W-W-L ne sont pas possibles.

Après avoir supprimé les redondances, voici les permutations possibles:

  win = fonction (w) {
  l = 1-w
  p = w * w * w +
    w * w * l * w + w * l * w * w + l * w * w * w +
    l * l * w * w * w + l * w * l * w * w + l * w * w * l * w +
    w * l * l * w * w + w * l * w * l * w +
    w * w * l * l * w

  retour (p)
}

gagner (.9)
# 0.99144

gagner (.9) + gagner (.1)
# 1
 

Taper manuellement les permutations devient rapidement incontrôlable avec des séries plus longues, c'est-à-dire remporter une série de jeux N = 7, une série de 9 jeux, etc. obtenir la bonne probabilité?

Voir [questions existantes sur Math.SE sur la série * probabiltiy win *] (https://math.stackexchange.com/search?q=probability+win+series+votes%3A5)
Les méthodes présentées dans les réponses à https://stats.stackexchange.com/questions/329521 résument brièvement cette question, qui est une version simplifiée de celle-ci.
Six réponses:
RyanFrost
2020-04-06 00:11:22 UTC
view on stackexchange narkive permalink

Vous pouvez utiliser la distribution binomiale négative pour ce problème.

Si X est distribué sous la forme NegBin (n, w), alors X est le nombre de parties que le joueur perd avant d'en gagner n, si la probabilité de gagner une partie donnée est w.

Donc, dnbinom (q = 2, size = 2, prob = w) est la probabilité que le joueur perd un total de 2 parties avant de gagner 2.

Ensuite, pnbinom (q = 2, size = 3, prob = w) est la probabilité que le joueur en perde 2 ou moins avant de gagner 3 parties. Ceci est égal à la probabilité de gagner une série 3 sur 5.

En général, la probabilité de gagner une meilleure série n-sur- (2n-1) peut être calculée avec pnbinom (q = n-1, size = n, prob = w) .

  ## w est la probabilité de gagner une partie individuelle
## k est le nombre de victoires nécessaires pour remporter la série (3 dans les 3 meilleures des 5 séries)
win <- fonction (w, k) {
  retour (pnbinom (q = k - 1, taille = k, prob = w))
}

gagner (0.9, 3)
## 0.99144
 
Belle solution utilisant une distribution binomiale négative, +1!À propos, pour la généralité, c'est-à-dire, pair ou impair `N`, l'application de` wins_needed <- plafond ((N + 1) / 2) `active une fonction générique` win`
Merci pour la note @ThomasIsCoding - dans ce cas, N devrait toujours être impair, car une série de longueur paire peut se terminer liée
Je suis d'accord cependant que le paramétrage de «win» en termes de N ouvre la porte à la saisie d'une série de longueur paire.Je l'ai changé en termes de k, les victoires nécessaires, pour y remédier.Merci encore pour la note
Si `N` est pair, alors vous avez besoin de` plafonnier ((N + 1) / 2) `gagne pour gagner la série, par exemple 4 sur 6. Dans ce cas, votre fonction générique` win` en termes de `N`peut être défini comme` win <- function (w, N) pnbinom (floor ((N-1) / 2), ceiling ((N + 1) / 2), w) `, qui peut traiter soit impaire soitmême `N`
ThomasIsCoding
2020-04-06 01:51:26 UTC
view on stackexchange narkive permalink

En fait, vous y êtes presque, mais vous devez être conscient des cas avec quatre et cinq matchs à gagner.

  win <- fonction (w) dbinom (3,3, w) + w * dbinom (2,3, w) + w * dbinom (2,4, w)
 

ou une solution compacte

  win <- fonction (w) w * somme (mapply (dbinom, 2,2: 4, w))
 

tel que

  > win (0.9)
[1] 0.99144
 

Explication: Étant donné que le nombre de parties nécessaires pour gagner la série dépend de la dernière victoire:

  • Si 3 jeux sont nécessaires: les deux premiers devraient tous les deux gagner, de sorte que le prob. est w ** 3 (de manière équivalente dbinom (3,3, w) ou dbinom (2,2, w) * w )

  • Si 4 parties sont nécessaires: parmi les trois parties précédentes, il devrait y avoir 2 victoires et 1 défaite, de sorte que le prob. est choose (4,2) * w ** 2 * (1-w) * w (de manière équivalente dbinom (2,4, w) * w )

  • Si 5 parties sont nécessaires: parmi les quatre parties précédentes, il devrait y avoir à la fois 2 victoires et 2 défaites, de sorte que le prob. est choose (4,2) * w ** 2 * (1-w) ** 2 * w (de manière équivalente dbinom (2,4, w) * w )


Update: Généralisation de win

Par rapport à tout N (pair ou impair), une fonction généralisée win peut être définie comme ci-dessous

  win <- fonction (w, N) w * somme (mapply (dbinom, plafond ((N-1) / 2), plafond ((N-1) / 2) :( N-1) , w))
 

Cependant, ci-dessus n'est pas aussi efficace pour les grands N s. Au lieu de cela, la méthode de distribution binomiale négative mentionnée par @RyanFrost est préférée pour les cas avec de grands N s, c'est-à-dire

  win <- fonction (w, N) pnbinom (plancher ((N-1) / 2), plafond ((N + 1) / 2), w)
 

Example

  > win (0.9,5) # besoins à 3 victoires sur 5 matchs
[1] 0.99144

> gagne (0.9,6) # besoins à 4 victoires sur 6 matchs
[1] 0,98415
 
Cole
2020-04-06 01:08:29 UTC
view on stackexchange narkive permalink

C'est intéressant. Démontrons en utilisant n = 3 où il faut 2 victoires pour être le gagnant. Nous pouvons d'abord déterminer quelles combinaisons sont disponibles

  n = 3L
lst = répliquer (n, 0: 1, simplifier = FALSE)
combos = do.call (expand.grid, lst)
combos

  Var1 Var2 Var3
1 0 0 0
2 1 0 0
3 0 1 0
4 1 1 0
5 0 0 1
6 1 0 1
7 0 1 1
8 1 1 1
 

Comme vous l'avez noté, certaines de ces combinaisons ne sont pas possibles. Nous sommes particulièrement intéressés lorsque les rowSums () sont égaux à 2. En utilisant cela, nous pouvons déterminer quelles combinaisons sont réellement possibles.

  possible_combos = combos [rowSums (combos) == plafond (n / 2),]
possible_combos

  Var1 Var2 Var3
4 1 1 0
6 1 0 1
7 0 1 1
 

Notre dernière étape consiste à calculer chaque contribution à partir de nos contributions possibles. Nous savons que w ^ 2 sera dans chaque calcul. La partie l est plus compliquée. Dans notre première combinaison possible, le l n'apporte rien. Nous pouvons utiliser max.col (..., ties.method = "last") pour déterminer combien de l s se sont produits:

  pertes = max.col (possible_combos, ties.method = "last") - plafond (n / 2)
pertes
# [1] 0 1 1

w = 0,9
l = 1 - w
wins_p = w ^ plafond (n / 2)
loss_p = ifelse (pertes == 0L, 1, l ^ pertes)

p = somme (wins_p * pertes_p)
p
# [1] 0,972
 

Pour généraliser cela, nous pouvons l'utiliser comme une fonction basée sur n et w :

  droite = fonction (n, w) {
  lst = répliquer (n, 0: 1, simplifier = FALSE)
  combos = do.call (expand.grid, lst)
  possible_combos = combos [rowSums (combos) == plafond (n / 2),]
  pertes = max.col (possible_combos, tie.method = "last") - plafond (n / 2)

  l = 1 - w
  wins_p = w ^ plafond (n / 2)
  loss_p = ifelse (pertes == 0L, 1, l ^ pertes)

  somme (wins_p * pertes_p)
}

droite (5, 0,9)
# [1] 0.99144
droite (5, 0,9) + droite (5, 0,1)
# [1] 1

 
StupidWolf
2020-04-06 01:18:47 UTC
view on stackexchange narkive permalink

C'est une distribution binomiale:

  dbinom (3,5,0.9) + dbinom (4,5,0.9) + dbinom (5,5,0.9) = 0.99144
 

La raison est la suivante, il vous suffit de penser à l'espace total, même s'il y a déjà 3 victoires ou 4 victoires, imaginons que l'événement continue et nous pouvons écrire les événements possibles à inclure comme suit:

  w.w.w: w.w.w.w.k, w.w.w.k.k, w.w.w.k.w, w.w.w.w, w
w.w.l.w: w.w.l.w.l, w.w.w.l.w
l.w.w.w: l.w.w.w.1, l.w.w.w.w
 

Et ainsi de suite ..

Et ceux qui ont écrit comme contenant 3 victoires par exemple (w.w.l.w.l) feront partie de 5 choisissent 3 dans un binôme.

Sur l'espace total de W / L sur 5 événements, nous avons besoin de 3 victoires, 4 victoires et 5 victoires pour inclure tous les événements qui peuvent amener l'équipe à gagner (même si dans la vraie vie, le 4e ouLe cinquième match n'aura pas lieu)

merci pour l'édition aussi!
ouais bien sûr, pbinom fonctionnerait.Je viens d'écrire la somme pour être claire.Merci de l'avoir signalé .. Je suppose que ce n'est pas une très bonne explication de toute façon lol
Cette somme peut aussi s'écrire `pbinom (5-3, 5, 1-0.9)` ou `1 - pbinom (5-3, 5, 0.9)`
Rui Barradas
2020-04-06 01:08:42 UTC
view on stackexchange narkive permalink

Voici une fonction win qui calcule la probabilité de gagner k sur n parties avec une probabilité de gagner chaque partie w .Il met en œuvre l'idée de ce message Math.SE.

  win <- fonction (w, n = 5, k = 3) {
  lâche fonction <- (w, n, k) {
    l <- 1 - w
    m <- n - k
    s <- seq_len (n - 1) [- seq_len (m - 1)]
    ch <- sapply (s, fonction (x) choisir (x, m))
    w <- w ^ (seq_along (s) - 1)
    l ^ m * somme (w * ch)
  }
  if (k > = plafond (n / 2)) {
    1 - lâche (w, n, k) * (1 - w)
  }autre{
    stop ("une minorité ne peut pas gagner.")
  }
}
gagner (0,9)
# [1] 0.99144

gagner (0,1)
# [1] 0,00856

gagner (0,9) + gagner (0,1)
# [1] 1
 
Mohsen Nemati
2020-04-06 13:16:14 UTC
view on stackexchange narkive permalink

Ce que vous demandez, c'est un simple problème de mathématiques. J'essaierai d'expliquer les mathématiques étape par étape, puis nous écrirons nos codes en conséquence.

Mathématiques

Combination
En mathématiques, une combinaison est une sélection d'éléments d'une collection et se définit comme suit.

enter image description here

! est l'opérateur factoriel. Par exemple, supposons que nous ayons quatre tours et que vous vouliez sélectionner trois victoires (ou une perdue). Nous avons:

enter image description here

Qui sont: w-w-w-l, w-w-l-w, w-l-w-w, l-w-w-w
Mais comme vous l'avez mentionné, w-w-w-l n'est pas acceptable car le jeu est terminé lorsque 3 victoires sont accomplies! Alors regardez bien ce point:

Si nos tours prennent plus de 3 (meilleur des 5), le dernier doit être gagnant si le calcul de la probabilité de gagner est souhaité!

Donc, pour corriger mes calculs, je dois d'abord sélectionner le dernier tour comme gagnant et sélectionner 2 autres places (parmi les places restantes) pour gagner. Ou

enter image description here

Et si nous montrons la probabilité de gagner avec w et de perdre avec l , la probabilité que cet état se produise est

enter image description here

Javascript

Maintenant que vous connaissez le concept, commençons à coder!
J'ai d'abord besoin d'une fonction pour calculer la factorielle de n ( n! ).

  let f = (n) = >
{
    soit o = 1;
    pour (i = 1; i< = n; i ++)
    {
        o * = i;
    }
    retour o;
}
 

Pour mieux comprendre la procédure, j'écrirai mes codes étape par étape. L'étape suivante consiste donc à définir la fonction de combinaison.

  let c = (n, r) = >
{
    retourne f (n) / (f (r) * f (n-r));
}
 

Et maintenant, il est temps de calculer la probabilité de gains de r dans un jeu à tour de p avec une probabilité de victoire de w .

  let _w = (p, r, w) = >
{
    soit o = 1;
    // Sélection des positions gagnantes
    o * = c (1,1) * c (p-1, r-1);
    // Probabilité de calcul
o * = Math.pow (w, r) * Math.pow (1-w, p-r);

    retour o;
}
 

Nous sommes maintenant prêts à faire la fonction BO (Best Of) avec N tours et K victoires.

  let BO = (N, K, w) = >
{
    // P est ce que nous souhaitons trouver!
    soit P = 0;
    pour (j = K; j< = N; j ++)
    {
        P + = _w (j, K, w);
    }
    return P;
}
 

Et quelques exemples:

  console.log (BO (5,3,0.9));// 0.9914400000000001
console.log (BO (7, 4, 0.9));// 0.997272
console.log (BO (9,5,0,9));// 0,99910908
 


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...