K臂老虎机问题Python代码实现

系统 1816 0

参考周志华的《西瓜书》

 第16章强化学习

16.2 K-摇臂赌博机

其实这个问题的目的就是为了能够获得更大的利润,但是具体怎样去获得更大的利润,用到了两种算法,一种是epsilon-贪心算法,另一种是Softmax算法,当然还有其他方法,具体可以参考http://incompleteideas.net/book/the-book-2nd.html,我在网上也找到了一位博主的博客,好像是翻译这本书的,写得挺好的,具体网址如下:https://blog.csdn.net/LagrangeSK

epsilon-贪心算法具体是选择一个平衡点,下次的行为可以随机选取,也可以选择当前收益最大化的行为,并实时更新动作的收益。而Softmax算法选择下一次行为是按照概率来选择,若一个动作的收益较大,则下次选择该动作的概率也大,并实时更新概率。具体代码如下:

            
              # -*- coding: utf-8 -*-
#K臂老虎机问题
import numpy as np
import random
import matplotlib.pyplot as plt
#K=[1,2,3,4,5]

def init():
    tau=0.1
    epsilon=0.01
    T=3000
    reword=[1,1]
    probability=[0.4,0.2]
    #arm=dict(list(zip(reword,Probability)))
    count=dict.fromkeys(["1",'2'],0)
    Q=dict.fromkeys(["1",'2'],0)
    sum_p=sum([np.exp(i/tau) for i in Q.values()])
    P=[np.exp(i/tau)/sum_p for i in Q.values()]
    return tau,epsilon,T,reword,probability,count,Q,P    
#epsilon-贪心算法
tau,epsilon,T,reword,probability,count,Q,P =init()
r=0
r_all=list()
#Q={"1":0.4,'2':0.2}
for i in range(T):
    if random.uniform(0,1)
              
                random.uniform(0,1) else 0
#    print(v)
    r=(r*(i)+v)/(i+1)
    r_all.append(r)
    count[str(k)] +=1
    Q[str(k)]=Q[str(k)]+(v-Q[str(k)])/count[str(k)]
#    print("平均奖赏为:",r)
plt.plot(list(range(T)),r_all,color='r')

#Softmax算法
r=0
r_all=list()
tau,epsilon,T,reword,probability,count,Q,P =init()
for i in range(T):
    sum_p=sum([np.exp(i/tau) for i in Q.values()])
    P=[np.exp(i/tau)/sum_p for i in Q.values()]
    k=int(np.random.choice(list(Q.keys()),p=P))
    v=reword[k-1] if probability[k-1]>random.uniform(0,1) else 0
    r=(r*(i)+v)/(i+1)
    r_all.append(r)
    count[str(k)] +=1
    Q[str(k)]=Q[str(k)]+(v-Q[str(k)])/count[str(k)]
#    print("平均奖赏为:",r)
plt.plot(list(range(T)),r_all,color='b')
plt.show()    
              
            
          

具体结果如下:

K臂老虎机问题Python代码实现_第1张图片

然后我发现这一张图片和书上比较接近,因此我选的这个图片进行展示,书上选择的图片显示效果很好,我个人觉得应该也是挑选过的。

其实在运行的过程中,会出现很多种情况,很多次都是前几次,前 十几次有可能平均收益突然增大到很大,但是最终都是趋于上述的结果,至于为什么不同的参数最终会趋于不同的结果,我个人人为 “仅探索”的形式为整体的期望,正常的形式(参数随机给)应该会逐渐趋于某一个臂(最优臂)的期望,至于“仅利用”我有点不太明白。


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论