\[ \text{数学建模:} R_{T} = \sum_{i=1}^{T}(W_{opt}-W_{B(i)})\text{,其中}R_T\text{代表累计遗憾;T是总选择次数;} W_{opt}\text{是最优收益;}W_{B(i)}\text{是第i次选择获得的收益} \]
\[ \text{特别地,当每次选择的收益是0或者1时,称为伯努利收益;上式可以化简为如下形式:} R_{T} = T - \sum_{i=1}^{T-N}0\text{,这里的N是取到收益1的次数} \]
Upper Confidence Bound,即置信区间上界
置信区间可以简单直观地理解为不确定性的程度,区间越宽,越不确定,反之就很确定。
\[ score(i) = \frac{N_i}{T} + \sqrt{\frac{2\ln_T}{N_i}} \text{,其中}N_i\text{代表第i个臂收益为1的次数;T是总选择次数。注:这里直接给出了结论,推导部分见附录} \]
import numpy as np
# T个用户/T次曝光
T = 1000
# N个电影/N个电影品类
N = 10
# 保证结果可复现
np.random.seed(888)
# 每部电影累积点击率(理论概率)
true_rewards = np.random.uniform(low=0, high=1, size=N)
# 每部电影当前点击率(实际频率)
estimated_rewards = np.zeros(N)
# 每部电影点击次数
chosen_count = np.zeros(N)
total_reward = 0
def calculate_delta(T, item):
if chosen_count[item] == 0:
return 1
else:
return np.sqrt(2 * np.log(T) / chosen_count[item])
def UCB(t, N):
# UCB得分
upper_bound_probs = [estimated_rewards[item] + calculate_delta(t, item) for item in range(N)]
item = np.argmax(upper_bound_probs)
# 模拟伯努利收益
reward = np.random.binomial(n=1, p=true_rewards[item])
return item, reward
# T个用户/T次曝光依次发生
for t in range(1, T):
# 为第t个用户推荐一部电影,reward = 1 表示用户点击观看,reward = 0 表示用户未点击
item, reward = UCB(t, N)
# print("item, reward = %s,%s" % (item, reward))
# 一共有多少用户接受了推荐/N部电影的点击次数
total_reward += reward
# 更新电影的当前点击率
estimated_rewards[item] = ((t - 1) * estimated_rewards[item] + reward) / t
# print(estimated_rewards[item])
chosen_count[item] += 1
# 输出当前点击率
# print(t,estimated_rewards)
# 输出累积点击率
# print(t,true_rewards)
diff = np.subtract(true_rewards,estimated_rewards)
print(diff[0])
0.8595606060609418
0.35956060606094176
0.19289393939427513
0.10956060606094176
0.2595606060609418
...
0.01640294418596766
0.016245471958934443
0.01709132465111296
0.01693347823970004
0.016775947837118665
1.LinUCB(加入了特征的UCB)
2.COFIBA算法(将Bandit算法与协同过滤结合使用)
17【MAB问题】简单却有效的Bandit算法
Bandit算法与推荐系统
UCB公式的理解
专治选择困难症——bandit算法
Multi-Armed Bandit: UCB (Upper Bound Confidence)
Bandit算法,A/B测试,孰优孰劣?
【MAB问题】结合上下文信息的Bandit算法
原文:https://www.cnblogs.com/arachis/p/RECE2E.html