基于汤普森采样的老虎机代码总选中首台机器问题如何修复?
问题成因
你代码的核心错误是奖励更新逻辑的位置错误:
- 汤普森采样每轮迭代只能选择1台老虎机,仅对被选中的机器更新输赢计数
- 你当前把
win_reward/loss_reward的更新代码放在了遍历所有机器计算beta值的内层循环里,每遇到一个beta值暂时高于当前最大值的机器,就会直接更新该机器的计数,这会导致单轮迭代多次更新不同机器的计数,总选中次数远大于设定的10000次 - 同时因为机器1(索引0)是内层循环第一个遍历的对象,每轮迭代必然会先触发一次它的计数更新,所以最终它的选中次数会远高于其他机器,和实际选择逻辑完全不符
修复方案
把奖励更新逻辑移到内层循环外面,等所有机器的beta值计算完毕、确定本轮最终选择的机器后,再更新对应计数即可,修改后的完整代码如下:
import numpy as np slotConRates = [.02, .013, .013, .015, .018] # 尝试次数 N = 10000 # 老虎机数量 d = len(slotConRates) # 预先生成每轮每台机器的中奖结果:1为中奖,0为未中奖 X = np.zeros((N,d)) for i in range(N): for j in range(d): if np.random.rand() < slotConRates[j]: X[i][j] = 1 win_reward = np.zeros(d) loss_reward = np.zeros(d) # 汤普森采样迭代 for i in range(N): selected = 0 MaxRandom = 0 # 遍历所有机器计算beta值,选出beta最大的机器 for j in range(d): randomBeta = np.random.beta(win_reward[j] + 1, loss_reward[j] + 1) if randomBeta > MaxRandom: MaxRandom = randomBeta selected = j # 仅更新本轮选中机器的输赢计数 if X[i][selected] == 1: win_reward[selected] += 1 else: loss_reward[selected] += 1 # 输出结果 nSelected = win_reward + loss_reward for i in range(d): print(f'Machine number {i + 1} was selected {nSelected[i]} times') print(f'Conclusion: Best machine is machine number {np.argmax(nSelected) + 1}')
修改后运行的总选中次数会等于10000,且会正确收敛到中奖率最高的1号机器(对应你设定的0.02最高中奖率)。
内容的提问来源于stack exchange,提问作者Abhishek Rai
相关产品推荐
相关产品推荐

