这是一个定量面试的问题:
A、B 是偏硬币。现在我们将 A 或 B 折腾 100 次,以确定哪一个有较大的正面概率。最优策略是什么?
其实我不太懂这个词optimal
,在我看来,抛A50次,抛B50次,那么正面出现频率高的那个有很大的正面概率。
这是一个定量面试的问题:
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)
除了之前的回复和有用的评论,以及回答实际问题,最好的方法是利用 Thomson Sampling, 在 sudeepraja 的博客上有一篇很棒的文章。
它从当前的后验中迭代地采样,选择最高的平均值。