bandit算法原理及Python实现
来源:互联网 发布:手绘漫画工具淘宝 编辑:程序博客网 时间:2024/06/05 02:59
Bandit算法是在线学习的一种,一切通过数据收集而得到的概率预估任务,都能通过Bandit系列算法来进行在线优化。这里的“在线”,指的不是互联网意义上的线上,而是只算法模型参数根据观察数据不断演变。
以多臂老虎机问题为例,首先我们假设每个臂是否产生收益,其背后有一个概率分布,产生收益的概率为p
我们不断地试验,去估计出一个置信度较高的概率p的概率分布就能近似解决这个问题了。
怎么能估计概率p的概率分布呢? 答案是假设概率p的概率分布符合beta(wins, lose)分布,它有两个参数: wins, lose。
每个臂都维护一个beta分布的参数。每次试验后,选中一个臂,摇一下,有收益则该臂的wins增加1,否则该臂的lose增加1。
初始化beta参数 胜率和败率都为0.5 beta参数要在后面的计算中不断更新的。
-------------------------------------------------------------------------------------------
Bandit算法是在线学习的一种,一切通过数据收集而得到的概率预估任务,都能通过Bandit系列算法来进行在线优化。这里的“在线”,指的不是互联网意义上的线上,而是只算法模型参数根据观察数据不断演变。
以多臂老虎机问题为例,首先我们假设每个臂是否产生收益,其背后有一个概率分布,产生收益的概率为p
我们不断地试验,去估计出一个置信度较高的概率p的概率分布就能近似解决这个问题了。
怎么能估计概率p的概率分布呢? 答案是假设概率p的概率分布符合beta(wins, lose)分布,它有两个参数: wins, lose。
每个臂都维护一个beta分布的参数。每次试验后,选中一个臂,摇一下,有收益则该臂的wins增加1,否则该臂的lose增加1。
初始化beta参数 胜率和败率都为0.5 beta参数要在后面的计算中不断更新的。-------------------------------------------------------------------------------------------
Beta分布:
对于硬币或者骰子这样的简单实验,我们事先能很准确地掌握系统成功的概率。然而通常情况下,系统成功的概率是未知的。为了测试系统的成功概率p,我们做n次试验,统计成功的次数k,于是很直观地就可以计算出p=k/n。然而由于系统成功的概率是未知的,这个公式计算出的p只是系统成功概率的最佳估计。也就是说实际上p也可能为其它的值,只是为其它的值的概率较小。
例如有某种特殊的硬币,我们事先完全无法确定它出现正面的概率。然后抛10次硬币,出现5次正面,于是我们认为硬币出现正面的概率最可能是0.5。但是即使硬币出现正面的概率为0.4,也会出现抛10次出现5次正面的情况。因此我们并不能完全确定硬币出现正面的概率就是0.5,所以p也是一个随机变量,它符合Beta分布。
Beta分布是一个连续分布,由于它描述概率p的分布,因此其取值范围为0到1。
Beta分布有α和β两个参数,其中α为成功次数加1,β为失败次数加1。
连续分布用概率密度函数描述,下面绘制实验10次,成功4次和5次时,系统成功概率p的分布情况。可以看出k=5时,曲线的峰值在p=0.5处,而k=4时,曲线的峰值在p=0.4处。
----------------------------------------------------------------------------------------------------------------几个bandit算法:
我们先从最简单的开始,先试几次,每个臂都有了均值之后,一直选均值最大那个臂。这个算法是我们人类在实际中最常采用的,不可否认,它还是比随机乱猜要好。
下一个,Thompson sampling算法:
简单介绍一下它的原理:
每次选择臂的方式是:用每个臂现有的beta分布产生一个随机数b,选择所有臂产生的随机数中最大的那个臂去摇。
以上就是Thompson采样,用python实现就一行:
第三个是UCB算法:
UCB算法全称是Upper Confidence Bound(置信区间上界),算法的具体步骤如下:
先对每一个臂都试一遍
之后,每次选择以下值最大的那个臂
其中加号前面是这个臂到目前的收益均值,后面的叫做bonus,本质上是均值的标准差,置信区间可以简单地理解为不确定性的程度,区间越宽,越不确定,反之亦反之。t是目前的试验次数,Tjt是这个臂被试次数。
这个公式反映:均值越大,标准差越小,被选中的概率会越来越大,起到了exploit的作用;同时哪些被选次数较少的臂也会得到试验机会,起到了explore的作用。
每个item的回报均值都有个置信区间,随着试验次数增加,置信区间会变窄(逐渐确定了到底回报丰厚还是可怜)。
每次选择前,都根据已经试验的结果重新估计每个item的均值及置信区间。
选择置信区间上限最大的那个item。
“选择置信区间上界最大的那个item”这句话反映了几个意思:
- 如果item置信区间很宽(被选次数很少,还不确定),那么它会倾向于被多次选择,这个是算法冒风险的部分;
- 如果item置信区间很窄(备选次数很多,比较确定其好坏了),那么均值大的倾向于被多次选择,这个是算法保守稳妥的部分;
- UCB是一种乐观的算法,选择置信区间上界排序,如果时悲观保守的做法,是选择置信区间下界排序。
第四个,Epsilon-Greedy算法:
选一个(0,1)之间较小的数epsilon
每次以概率epsilon(产生一个[0,1]之间的随机数,比epsilon小)做一件事:所有臂中随机选一个。否则,选择截止当前,平均收益最大的那个臂。
是不是简单粗暴?epsilon的值可以控制对Exploit和Explore的偏好程度。越接近0,越保守,只想花钱不想挣钱。
代码:
对于硬币或者骰子这样的简单实验,我们事先能很准确地掌握系统成功的概率。然而通常情况下,系统成功的概率是未知的。为了测试系统的成功概率p,我们做n次试验,统计成功的次数k,于是很直观地就可以计算出p=k/n。然而由于系统成功的概率是未知的,这个公式计算出的p只是系统成功概率的最佳估计。也就是说实际上p也可能为其它的值,只是为其它的值的概率较小。
例如有某种特殊的硬币,我们事先完全无法确定它出现正面的概率。然后抛10次硬币,出现5次正面,于是我们认为硬币出现正面的概率最可能是0.5。但是即使硬币出现正面的概率为0.4,也会出现抛10次出现5次正面的情况。因此我们并不能完全确定硬币出现正面的概率就是0.5,所以p也是一个随机变量,它符合Beta分布。
Beta分布是一个连续分布,由于它描述概率p的分布,因此其取值范围为0到1。
Beta分布有α和β两个参数,其中α为成功次数加1,β为失败次数加1。
连续分布用概率密度函数描述,下面绘制实验10次,成功4次和5次时,系统成功概率p的分布情况。可以看出k=5时,曲线的峰值在p=0.5处,而k=4时,曲线的峰值在p=0.4处。
几个bandit算法:
我们先从最简单的开始,先试几次,每个臂都有了均值之后,一直选均值最大那个臂。这个算法是我们人类在实际中最常采用的,不可否认,它还是比随机乱猜要好。
下一个,Thompson sampling算法:
简单介绍一下它的原理:
每次选择臂的方式是:用每个臂现有的beta分布产生一个随机数b,选择所有臂产生的随机数中最大的那个臂去摇。
以上就是Thompson采样,用python实现就一行:
第三个是UCB算法:
UCB算法全称是Upper Confidence Bound(置信区间上界),算法的具体步骤如下:
先对每一个臂都试一遍
之后,每次选择以下值最大的那个臂
其中加号前面是这个臂到目前的收益均值,后面的叫做bonus,本质上是均值的标准差,置信区间可以简单地理解为不确定性的程度,区间越宽,越不确定,反之亦反之。t是目前的试验次数,Tjt是这个臂被试次数。
这个公式反映:均值越大,标准差越小,被选中的概率会越来越大,起到了exploit的作用;同时哪些被选次数较少的臂也会得到试验机会,起到了explore的作用。
每个item的回报均值都有个置信区间,随着试验次数增加,置信区间会变窄(逐渐确定了到底回报丰厚还是可怜)。
每次选择前,都根据已经试验的结果重新估计每个item的均值及置信区间。
选择置信区间上限最大的那个item。
“选择置信区间上界最大的那个item”这句话反映了几个意思:
- 如果item置信区间很宽(被选次数很少,还不确定),那么它会倾向于被多次选择,这个是算法冒风险的部分;
- 如果item置信区间很窄(备选次数很多,比较确定其好坏了),那么均值大的倾向于被多次选择,这个是算法保守稳妥的部分;
- UCB是一种乐观的算法,选择置信区间上界排序,如果时悲观保守的做法,是选择置信区间下界排序。
第四个,Epsilon-Greedy算法:选一个(0,1)之间较小的数epsilon
每次以概率epsilon(产生一个[0,1]之间的随机数,比epsilon小)做一件事:所有臂中随机选一个。否则,选择截止当前,平均收益最大的那个臂。
是不是简单粗暴?epsilon的值可以控制对Exploit和Explore的偏好程度。越接近0,越保守,只想花钱不想挣钱。
代码:
- bandit算法原理及Python实现
- bandit算法原理及Python实现
- bandit算法原理及Python实现
- bandit算法原理及Python实现
- logistic回归算法原理及python实现
- 聚类算法原理及python实现
- 感知机算法原理(PLA原理)及 Python 实现
- 推荐系统的EE问题及Bandit算法
- ID3算法的原理及实现(Python)
- K近邻算法原理及实现(Python)
- 决策树之CART算法原理及python实现
- 集成学习AdaBoost算法原理及python实现
- 常用排序和查找算法的原理及python实现
- bandit 算法资料大全
- PCA原理及Python实现
- CART算法原理及实现
- 谱聚类算法原理及实现
- CART算法原理及实现
- macOS设置host文件
- kali 中文输入法的安装问题
- Android 资源目录的相关知识
- 每天一个Linux命令(48):lsof
- Sed
- bandit算法原理及Python实现
- 重载back按钮响应事件
- 安卓可拖拽悬浮按钮
- 在线专题数据,GIS应用新选择
- linux 克隆及 错误
- 解决双系统中格式化Ubuntu后无法启动Windows
- android studio—— Github 从创建到提交
- 腾讯笔试题——数组位操作
- linux xshell连接