置信区间上界算法-Python
2018-04-10 本文已影响7人
灵妍
随机投放
1、导入标准库
代码:
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
2、投放规则
虚拟数据.PNG实际中我们不可能通过在网页上轮番投放广告,统计用户会点击某个广告,不会点击某个广告,所以这里我们生成虚拟数据模拟用户的行为,数据代表10000个用户,对于这10个广告的选择。
代码:
# Implementing Random Selection
import random
N = 10000
d = 10
ads_selected = []
total_reward = 0
for n in range(0, N):
ad = random.randrange(d)
ads_selected.append(ad)
reward = dataset.values[n, ad]
total_reward = total_reward + reward
这里我们计算通过随机投放广告,用户总的点击率。
ads_select.PNG
这里记录的是对于每个用户投放的广告,广告是随机投放的。
total_rewards.PNG
这里记录是总的点击次数。
3、可视化
可视化代码:
# Visualising the results
plt.hist(ads_selected)
plt.title('Histogram of ads selections')
plt.xlabel('Ads')
plt.ylabel('Number of times each ad was selected')
plt.show()
广告投放分布.PNG
这里可以看到每一个广告投放的概率差不多一样。
UCB算法投放
1、数据预处理
代码:
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('Ads_CTR_Optimisation.csv')
2、UCB算法实现
置信区间上界算法步骤.PNG代码:
# Implementing UCB
import math
N = 10000
d = 10
ads_selected = []
numbers_of_selections = [0] * d
sums_of_rewards = [0] * d
total_reward = 0
for n in range(0, N):
ad = 0
max_upper_bound = 0
for i in range(0, d):
if (numbers_of_selections[i] > 0):
average_reward = sums_of_rewards[i] / numbers_of_selections[i]
delta_i = math.sqrt(3/2 * math.log(n + 1) / numbers_of_selections[i])
upper_bound = average_reward + delta_i
else:
upper_bound = 1e400
if upper_bound > max_upper_bound:
max_upper_bound = upper_bound
ad = i
ads_selected.append(ad)
numbers_of_selections[ad] = numbers_of_selections[ad] + 1
reward = dataset.values[n, ad]
sums_of_rewards[ad] = sums_of_rewards[ad] + reward
total_reward = total_reward + reward
算法解析:
这里的第一个循环是遍历10000个用户,第二个循环是遍历10个广告。
我们通过置信区间上界的取值决定投放的广告。
为什么置信区间上界的值要足够大:
因为在第一次遍历广告的时候,会确定选择第一个广告,第一个广告被投放过一次后,它的置信区间上界肯定比第二个小,这样一开始投放的就是前10个广告,它置信区间的算法与该广告的投放点击率,投放广告的轮数,以及该广告的投放轮数有关。
UCB总点击率.PNG
可以看出广告的总点击率比随机投放提升了一倍。
3、可视化
代码:
# Visualising the results
plt.hist(ads_selected)
plt.title('Histogram of ads selections')
plt.xlabel('Ads')
plt.ylabel('Number of times each ad was selected')
plt.show()
UCB投放策略.PNG
可以看出,根据每一个用户的点击结果得到的投放策略,比随机投放的点击率要多很多。
我们不仅仅是要算出每一个广告的点击率,而且要使点击总量达到最大。
tip:本宝宝是学控制的,这跟我们的反馈控制很像呢,根据输出调节输入。