参考周志华的《西瓜书》
第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()
具体结果如下:
然后我发现这一张图片和书上比较接近,因此我选的这个图片进行展示,书上选择的图片显示效果很好,我个人觉得应该也是挑选过的。
其实在运行的过程中,会出现很多种情况,很多次都是前几次,前 十几次有可能平均收益突然增大到很大,但是最终都是趋于上述的结果,至于为什么不同的参数最终会趋于不同的结果,我个人人为 “仅探索”的形式为整体的期望,正常的形式(参数随机给)应该会逐渐趋于某一个臂(最优臂)的期望,至于“仅利用”我有点不太明白。