Probability
偏硬幣面試題
這是一個定量面試的問題:
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)