You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于汤普森采样的老虎机代码总选中首台机器问题如何修复?

问题成因

你代码的核心错误是奖励更新逻辑的位置错误:

  • 汤普森采样每轮迭代只能选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:30:03