Probability

偏硬幣面試題

  • October 4, 2020

這是一個定量面試的問題:

A、B 是偏硬幣。現在我們將 A 或 B 折騰 100 次,以確定哪一個有較大的正面概率。最優策略是什麼?

其實我不太懂這個詞optimal,在我看來,拋A50次,拋B50次,那麼正面出現頻率高的那個有很大的正面概率。

沒有什麼比有人告訴你做“最佳”的事情而沒有告訴你優化的標準更讓我沮喪的了。話雖如此,我敢打賭,由於這是一次採訪,他們打算讓您確定您想要優化的內容。

如果我們想優化統計功效,您的方法可能不是“最佳”的。如果偏差的差異很小,50 次翻轉可能不足以檢測哪個硬幣的偏差更大。

我懷疑他們希望你了解強盜算法。考慮到翻轉的限制和學習具有最大偏差的硬幣的目標,這聽起來像是一個可能在工業中運行的 AB 測試。運行算法的一種方式如下:

  • 從每個硬幣偏差的統一貝塔先驗開始
  • 從這些先驗中抽取並選擇抽取最大的硬幣。
  • 翻轉硬幣並更新先驗(現在是後驗)
  • 重複

這是bandit的python實現。這兩個硬幣的偏差分別為 0.4 和 0.6。老虎機正確地識別出硬幣 2 具有更大的偏差(如後驗集中在更大的偏差上所證明的那樣。

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)

在此處輸入圖像描述

引用自:https://stats.stackexchange.com/questions/490363

comments powered by Disqus

相關問答