算法思想
累计遗憾
i=1∑T(Gopt∗−Gi)
Gopt∗是最优选择方案的收益 ,
Gi是实际采取的选择的收益。
目标是累计遗憾最小 。
- 更多选择确定好的方案
- 更少寻找确定不好的方案
- 更多选择不确定好坏的方案
常见的Bandit算法
汤普森采样
Beta分布的PDF概率密度函数为:
B(α,β)1xα−1(1−x)β−1
其中:
B(α,β)=Γ(α)Γ(β)Γ(α+β)
- 当
α+β越大,曲线越窄,分布越集中。
- 当
α+βα越大,中心越接近于1;反之则越接近于0。
则可分为三种情况:
-
α+β很大,并且
α+βα很大,分布很窄,中心接近于1
-
α+β很大,并且
α+βα很小,分布很窄,中心接近于0
-
α+β很小,分布很宽
当Beta分布用到推荐系统时,
α 可表示推荐后用户点击次数,
β可表示推荐后用户未点击次数。每个用户每个商品都要维护各自的
α和β。
-
α+β很大,并且
α+βα很大,表示该物品用户比较大可能点击,是个好的候选项,起到利用Exploit的作用。
-
α+β很大,并且
α+βα很小,表示该物品用户比较小可能点击,是个坏的候选项
-
α+β很小 ,表示该物品被推荐的次数比较少,用户是否点击不太确定,需要多推荐。起到探索Explore的作用。
scipy.stats.distributions.beta.ppf(np.random.random(size), pos, neg)
UCB算法
置信区间上界。为每个臂评分,每次选出评分最高的臂输出,然后观察用户反馈,再更新相应的臂的参数。
每个臂的评分为:
Xj(t)+Tj,t2lnt
Xj(t)是该候选臂到目前为止的平均收益,
Tj,t是该候选臂被选择的次数,t为总的选择次数。
算法思想和汤普森采样一样 :
- 以每个候选臂的平均收益为基准进行选择。
- 对于选择次数不足的给予照顾。
- 倾向于选择那些确定收益较好的选择。
for arm in range(n_arms):
bonus = math.sqrt((2 * math.log(total_counts)) / float(counts[arm]))
new_rewards[arm] = old_rewards[arm] + bonus
Epsilon算法
⎩⎨⎧随机选择一个臂,选择最大平均收益的臂,以ϵ概率以1−ϵ概率
if random.random() > epsilon:
return ind_max(rewards)
else:
return random.randrange(len(rewards))
反馈更新:
new_reward=nn−1∗old_reward+n1∗reward