Interview Frage der voreingenommenen Münze

Oct 04 2020

Hier ist eine Frage des quantitativen Interviews:

A, B sind voreingenommene Münzen. Jetzt werfen wir 100 Mal A oder B, um festzustellen, welches die größere Wahrscheinlichkeit für den Kopf hat. Was ist die optimale Strategie?

Eigentlich verstehe optimalich das Wort nicht sehr , meiner Meinung nach hat 50 Mal A und 50 Mal B geworfen, dann hat derjenige mit der großen Häufigkeit des Kopfes die große Wahrscheinlichkeit des Kopfes.

Antworten

5 DemetriPananos Oct 04 2020 at 21:11

Nichts frustriert mich mehr als wenn jemand Ihnen sagt, dass Sie das "Optimale" tun sollen, ohne Ihnen die Kriterien für die Optimierung mitzuteilen. Davon abgesehen wette ich, dass Sie, da es sich um ein Interview handelte, bestimmen sollten, wofür Sie optimieren wollten.

Ihr Ansatz ist möglicherweise nicht "optimal", wenn wir die statistische Leistung optimieren möchten. Wenn der Unterschied in der Vorspannung gering ist, reichen 50 Flips möglicherweise nicht aus, um festzustellen, welche Münze eine größere Vorspannung aufweist.

Ich vermute, sie hatten gehofft, Sie wüssten etwas über Banditenalgorithmen. Angesichts der Beschränkung der Flips und des Ziels, die Münze mit der größten Tendenz zu lernen, klingt dies wie ein AB-Test, den man in der Industrie durchführen könnte. Ein Weg, wie der Algorithmus ausgeführt wird, ist wie folgt:

  • Beginnen Sie mit jeweils einheitlichen Beta-Prioritäten für die Vorurteile der Münze
  • Ziehen Sie aus diesen Prioritäten und wählen Sie die Münze aus, deren Ziehung am größten war.
  • Wirf die Münze und aktualisiere die Priors (jetzt Posteriors).
  • Wiederholen

Hier ist eine Python-Implementierung des Banditen. Die beiden Münzen haben eine Vorspannung von 0,4 bzw. 0,6. Der Bandit identifiziert korrekt, dass Münze 2 die größere Vorspannung aufweist (wie durch die Konzentration des hinteren Teils auf größere Vorspannungen belegt wird.

import numpy as np
from scipy.stats import beta, binom
import matplotlib.pyplot as plt

import numpy as np
from scipy.stats import beta, binom
import matplotlib.pyplot as plt

class Coin():
    
    def __init__(self):
        self.a = 1
        self.b = 1
    def draw(self):
        return beta(self.a, self.b).rvs(1)
    def update(self, flip):
        if flip>0:
            self.a+=1
        else:
            self.b+=1
    def __str__(self):
        return f"{self.a}:{self.b}={self.a/(self.a+self.b):.3f}"



#Unknown to us
np.random.seed(19920908)
coin1 = binom(p=0.4, n=1)
coin2 = binom(p=0.6, n=1)


model1 = Coin()
model2 = Coin()

for i in range(100):

    draw1 = model1.draw()
    draw2 = model2.draw()

    if draw1>draw2:
        flip = coin1.rvs()
        model1.update(flip)
    else:
        flip = coin2.rvs()
        model2.update(flip)


        
x = np.linspace(0,1,101)

plt.plot(x, beta(model1.a, model1.b).pdf(x))
plt.plot(x, beta(model2.a, model2.b).pdf(x))
print(model1,model2)

1 John Oct 06 2020 at 00:13

Zusätzlich zu der vorherigen Antwort und nützlichen Kommentaren und zur Beantwortung der eigentlichen Frage besteht der beste Ansatz darin, Thomson Sampling zu nutzen. Es gibt einen ausgezeichneten Artikel auf sudeeprajas Blog.

Es werden iterativ Stichproben aus dem aktuellen posterioren Bereich entnommen, wobei der höchste Mittelwert ausgewählt wird.