偏硬币面试题

机器算法验证 可能性
2022-03-07 20:15:17

这是一个定量面试的问题:

A、B 是偏硬币。现在我们将 A 或 B 折腾 100 次,以确定哪一个有较大的正面概率。最优策略是什么?

其实我不太懂这个词optimal,在我看来,抛A50次,抛B50次,那么正面出现频率高的那个有很大的正面概率。

2个回答

没有什么比有人告诉你做“最佳”的事情而没有告诉你优化的标准更让我沮丧的了。话虽如此,我敢打赌,由于这是一次采访,他们打算让您确定您想要优化的内容。

如果我们想优化统计功效,您的方法可能不是“最佳”的。如果偏差的差异很小,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 的博客上有一篇很棒的文章。

它从当前的后验中迭代地采样,选择最高的平均值。