机器学习之置信区间上界算法

零、算法原理


一、导入标准库

In [2]:
# Importing the libraries 导入库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 使图像能够调整
%matplotlib notebook 
#中文字体显示  
plt.rc('font', family='SimHei', size=8)

二、导入数据

In [8]:
dataset = pd.read_csv('Ads_CTR_Optimisation.csv') # 数据表示虚拟环境,模拟我将投放哪些广告
dataset
Out[8]:
 Ad 1Ad 2Ad 3Ad 4Ad 5Ad 6Ad 7Ad 8Ad 9Ad 10
01000100010
10000000010
20000000000
30100000100
40000000000
51100000000
60001000000
71100100000
80000000000
90010000000
100000000000
110000000000
120001000000
130000000010
140000000100
150000100100
160000000000
170000000000
180000000100
190000000010
200100000100
210000100001
220000000000
230000000110
240000101100
250000000000
260100100100
270101000000
280000000000
290000100110
.................................
99700000000000
99710000000100
99720000000000
99730000100000
99740000000110
99750000101010
99760000100100
99770100101000
99780000100000
99790010001000
99801101000000
99810000000000
99820100000000
99830000100110
99840000100000
99850000000100
99860000100000
99870000100000
99881000100000
99890000000000
99900001000000
99910101101000
99920001001000
99930000100010
99940010000010
99950010000100
99960000000000
99970000000000
99981000000100
99990100000000

10000 rows × 10 columns

问题描述

三、每个用户随机抽选广告得到的点击数

In [27]:
import random
N = 10000  # 1000个用户
d = 10     # 10个广告
ads_selected = [] # 广告选择
total_reward = 0 
for n in range(0, N):      # 每个用户循环
    ad = random.randrange(d) # 随机选择广告
    ads_selected.append(ad)  # 将选择的广告加入list中
    reward = dataset.values[n, ad] # 取出数据集中n行ad列查看是否命中,命中值为1,未命中值为0(1即为奖励)
    total_reward = total_reward + reward  # 每轮奖励累计相加

print(total_reward)
# 画图
plt.hist(ads_selected)
plt.title(u'广告选择直方图')
plt.xlabel(u'广告')
plt.ylabel(u'每个广告的点击数')
plt.show()
1282

图中我们可以看到,由于是随机的,10000个人选择10种广告,每个人平均会在1000次左右

四、置信区间上界算法

In [55]:
import math
N = 10000  # 1000个用户
d = 10     # 10个广告
ads_selected = [] # 广告选择
numbers_of_selections = [0] * d # 多项选择
sums_of_rewards = [0] * d  # 奖励总和
total_reward = 0
for n in range(0, N): # 第n个用户
    ad = 0 # 广告初始化
    max_upper_bound = 0  # 最大上界初始化
    for i in range(0, d): # 第i个广告
        if (numbers_of_selections[i] > 0):
            average_reward = float(sums_of_rewards[i]) / float(numbers_of_selections[i]) # 平均奖励,这里如果python2记得用float
            delta_i = math.sqrt(3/2 * math.log(n + 1) / numbers_of_selections[i]) # 置信区间
            upper_bound = average_reward + delta_i # 置信区间上界
#             print(average_reward)
#             print(delta_i )
        else:
            upper_bound = 10000
        if upper_bound > max_upper_bound:
            max_upper_bound = upper_bound
            ad = i
#     print(ad)
    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
# print(ads_selected)
print(total_reward)
# print(numbers_of_selections)
# print(sums_of_rewards)
2358
In [56]:
# 画图
plt.hist(ads_selected)
plt.title(u'广告选择直方图')
plt.xlabel(u'广告')
plt.ylabel(u'每个广告的点击数')
plt.show()

从图中可以看到,广告5被点击数明显比较多。总奖励也提高了一倍,证明我们的算法很NB

五、项目地址

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若云流风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值