机器学习-K-摇臂赌博机相关算法

一,介绍

学习K-摇臂赌博机的相关算法需要明白两个概念:探索和利用。

仅探索:将所有尝试机会平均分给每个摇臂,以各个摇臂的平均吐币概率作为奖赏期望。

仅利用:按下目前最优的摇臂,有多个则随机选取一个。

算法一:ε-贪心算法

基于概率对探索和利用折中:以ε的概率进行探索,以1-ε的概率进行利用,一般如果尝试次数非常大,可以让ε随着尝试次数增加而减小。

我们用Q(k)表示平均奖赏:

                         

算法二:Softmax算法

此算法假设已知各摇臂平均奖赏,基于Boltzmann分布选取摇臂:

                                                                        机器学习-K-摇臂赌博机相关算法_第1张图片

其中Q(i)为当前平均奖赏,τ>0称为“温度”。

二,代码

import random

# ε贪心算法
def EGreedy(e=0.9,T=1000):
    # 构造一个5臂的摇臂机
    ArmedBandit = [random.randint(0,100)/100,random.randint(0,100)/100,random.randint(0,100)/100,random.randint(0,100)/100,random.randint(0,100)/100]
    Q=[0.0,0.0,0.0,0.0,0.0];count=[0,0,0,0,0];select=0;bonus=0;v=0
    while T>0:      # 开始循环,假设中奖都是1,未中奖为0
        rand = random.randint(0, 100) / 100  # 产生随机数用于判断是探索还是利用
        r = random.randint(0, 100) / 100  # 产生随机数判断是否中奖
        v=0
        if(rand 
  

 

import random
import math

# Softmax算法
def Softmax(au=1,T=1000):
    # 构造一个5臂的摇臂机
    ArmedBandit = [random.randint(0, 100) / 100, random.randint(0, 100) / 100, random.randint(0, 100) / 100,
                   random.randint(0, 100) / 100, random.randint(0, 100) / 100]
    # 摇臂初始奖赏,
    Q = ArmedBandit.copy()
    count = [100, 100, 100, 100, 100];  #假设初始奖赏是各个摇臂100次计算出来的
    bonus = 0
    def Boltzmann(au, Q):   # 计算Boltzmann分布
        P = [];sum=0.0
        for i in range(len(Q)):
            sum += math.exp(Q[i] / au)
        for i in range(len(Q)):
            P.append(math.exp(Q[i]/au)/sum)
        return P

    while T>0:
        p = Boltzmann(au,Q)
        r=random.randint(0, 10000) / 10000  #产生随机数获取摇杆
        rand = random.randint(0, 100) / 100  # 产生随机数用于判断是否中奖
        sum = 0.0;select=0;v=0
        for i in range(len(p)):   # 获取选择的摇杆
            sum+=p[i]
            if(r 
 

你可能感兴趣的:(机器学习-周志华)