예제 #1
0
def UCB(arg):
    T = arg[0]  #Nombre de tests total
    N = arg[1]  #Nombre de medicaments

    s = [0] * N  #Compteur du nombre de fois ou on a teste chaque medicament
    regret = [0]
    moy = [0] * N
    B = [0] * N
    a = 0
    b = 1

    #Initialisation
    for i in range(N):
        moy[i] = gain.resMed(i + 1)[0]
        s[i] += 1
        regret.append(regret[-1] + (-gain.resMed(i + 1)[1] + gain_max) / T)

    for t in range(N, T + 1):
        for k in range(N):
            B[k] = moy[k] + (b - a) * math.sqrt(2 * np.log(1 / 0.95) /
                                                (1 * s[k]))
        k = np.argmax(np.asarray(B))
        moy[k] = gain.resMed(k + 1)[0] / (s[k] + 1) + (s[k]) / (s[k] +
                                                                1) * moy[k]
        s[k] += 1
        regret.append(regret[-1] + (-gain.resMed(k + 1)[1] + gain_max) / T)

    return np.asarray(regret[1:-1]), s
예제 #2
0
def Eps_greedy_temps(arg):
    eps = arg[0]  #Constante de temps
    T = arg[1]  #Nombre de tests total
    N = arg[2]  #Nombre de medicaments

    moy = [0] * N
    s = [0] * N  #Compteur du nombre de fois ou on a teste chaque medicament
    regret = [0]

    #Initialisation
    for i in range(N):
        moy[i] = gain.resMed(i + 1)[0]
        s[i] += 1
        regret.append(regret[-1] + (-gain.resMed(i + 1)[1] + gain_max) / T)

    for i in range(N, T + 1):
        if np.random.random(
        ) < 1 - eps / i**2:  #Meilleure courbe de regret lorsque E decroit en 1/t²
            k = np.argmax(moy)
        else:
            k = np.random.randint(0, N)
        moy[k] = gain.resMed(k + 1)[0] / (s[k] + 1) + (s[k]) / (s[k] +
                                                                1) * moy[k]
        s[k] += 1
        regret.append(regret[-1] + (-gain.resMed(k + 1)[1] + gain_max) / T)

    return np.asarray(regret[1:-1]), s
예제 #3
0
def Exp3(arg):
    T = arg[0]  #Nombre de tests total
    N = arg[1]  #Nombre de medicaments

    p = [1 / N] * N
    regret = [0]
    G = [0] * N
    gain_estim = 0
    gamma = np.sqrt(N * np.log(N) / T)
    eta = np.sqrt(2 * np.log(N) / (T * N))
    liste = np.array(list(range(1, N + 1)))
    choix = [0
             ] * N  #Compteur du nombre de fois ou on a teste chaque medicament

    for t in range(T):
        k = np.random.choice(a=liste, p=p)
        choix[k - 1] += 1
        gain_obtenu = gain.resMed(k)[1]
        regret.append(regret[-1] + (-gain_obtenu + gain_max) / T)
        gain_estim = gain_obtenu / p[k - 1]
        G[k - 1] += gain_estim
        somme = 0
        for i in range(len(p)):
            somme += np.sum(np.exp(eta * G[i]))
        for i in range(len(p)):
            p[i] = (1 - gamma) * np.exp(eta * G[i]) / somme + gamma / N

    return np.asarray(regret[1:]), choix
예제 #4
0
def Eps_greedy(arg):
    eps = arg[0]  #Epsilon
    T = arg[1]  #Nombre de tests total
    N = arg[2]  #Nombre de médicaments

    s = [0] * N  #Compteur du nombre de fois ou on a teste chaque medicament
    regret = [0]
    moy = [0] * N
    med = list(range(N))
    #Initialisation
    for i in range(N):
        moy[i] = gain.resMed(i)[0]
        s[i] += 1
        regret.append(regret[-1] + (-gain.resMed(i)[1] + gain_max) / T)

    for i in range(N, arg[1] + 1):
        if np.random.random() < 1 - eps:
            if np.where(moy == np.max(moy))[0].shape[
                    0] > 1:  # Si plusieurs médicaments ont la meilleure moyenne empirique
                # On choisit le médicament le plus testé
                indices = np.take(med,
                                  np.where(moy == np.max(moy))
                                  [0])  # indices des meilleures moyennes
                essais = np.take(
                    s, indices)  # nombre d'essais pour ces médicaments
                k = indices[np.argmax(
                    essais)]  # indice du médicament le plus testé

            else:
                k = np.argmax(
                    moy
                )  #on choisit le médicament avec la meilleure moyenne avec une probabilite 1-E
        else:
            k = np.random.randint(
                0, N)  #ou on choisit le médicament aleatoirement (proba E)

        moy[k] = gain.resMed(k + 1)[0] / (s[k] + 1) + (s[k]) / (s[k] +
                                                                1) * moy[k]
        s[k] += 1
        regret.append(regret[-1] + (-gain.resMed(k + 1)[1] + gain_max) / T)

    return np.asarray(regret[1:-1]), s
예제 #5
0
def Strategie_1(arg):

    T1 = arg[0]  #Nombre de jeton en phase d'exploration
    T = arg[1]  #Nombre de tests total
    N = arg[2]  #Nombre de medicaments

    n = T1 // N  #Nombre d'essais de chaque medicaments en phase d'exploration
    essais = [
    ]  #Contient un vecteur d'essais par medicament pour les T1 premiers lancers
    regret = [0]
    choix = [0
             ] * N  #Compteur du nombre de fois ou on a teste chaque medicament

    #On fait n essais pour chaque medicament qu'on range dans essais_machine
    for k in range(N):
        essai_machine = []
        for i in range(n):
            essai_machine.append(gain.resMed(k + 1)[0])
            choix[k] += 1
            regret.append(regret[-1] + (-gain.resMed(k + 1)[1] + gain_max) / T)

        essais.append(essai_machine)
        res = np.asarray(essais)

    #On determine la medicament avec la meilleure moyenne
    moy = []
    for i in range(N):
        moy.append(np.mean(res[i]))
    k = np.argmax(moy) + 1

    #On joue le reste de nos essais avec le meilleur medicament
    essai_machine = []
    for i in range(T - T1 - 1):
        essai_machine.append(gain.resMed(k)[0])
        choix[k - 1] += 1
        regret.append(regret[-1] + (-gain.resMed(k)[1] + gain_max) / T)

    return np.array(regret), choix
예제 #6
0
def KL_UCB(arg):

    f = (lambda t: np.log(t) + 3. * np.log(np.log(t)))
    s = np.ones(arg[0])  # Nombre de fois ou chaque bras a été joué
    p_space = [
        0, 1
    ]  # On suppose que la variable aléatoire peut prendre des valeurs entre 0 et 1, changer les bornes ici si necessaire

    mu_estim = np.zeros(
        (arg[0],
         arg[1]))  #ligne=bras, colone=discretisation, densité empirique
    R = np.zeros(arg[2])
    regret = [0]
    # Dictionnaire contenant pour chaque bras, le nombre de fois ou chaque valeur possible à été observé, initialisé à 0 fois vue la valeur 1.
    obs = dict()
    for arm in range(arg[0]):
        obs[arm] = dict({1.: 0})
    idx = np.zeros(arg[0])
    # print(list(obs[1].items()))
    ### Initialisation pour chaque bras
    for t in np.arange(0, arg[0]):
        # p_t = gain du bras t
        R[t] = gain.resMed(t + 1)[0]
        regret.append(regret[-1] +
                      (-gain.resMed(t + 1)[1] + gain_max) / arg[2])

        loc = np.argmin(
            np.abs(p_space - R[t])
        )  # On cherche le point de discretisation le plus proche de la valeur obtenue.
        mu_estim[t, loc] += 1.

        # Ajouté la valeur obsérvé au dictionnaire
        reward = p_space[loc]
        if reward in obs[t]:
            obs[t][reward] += 1
        else:
            obs[t][reward] = 1

        ### Boucle principale
    t = arg[0]
    while t < arg[2]:

        ## Résolution du problème d'optimisation
        # Pour chaque bras on:
        for arm in range(arg[0]):
            if s[arm] != 0:
                p = (np.array(list(obs[arm].values()))) / float(
                    sum(obs[arm].values()))  # normalise la densité estimée

                v = np.array(list(obs[arm].keys()))
                q = maxEV(
                    p, v,
                    f(t / s[arm]) /
                    s[arm])  # Résoud le problème d'optimisation discrétisé
                idx[arm] = (np.dot(q, v))  # calcul la valeur associé à ce bras
                #print(arm, obs)
            else:
                idx[arm] = 10**10  # Si on a jamais joué se bras, on va vouloir le jouer prochainement donc on met sa valeur au maximum

        #print(idx)  # Marche pas, donne les mêmes valeurs pour tous les bras

        current_idx = np.argmax(
            idx)  # On cherche l'indice du bras à la plus forte valeur

        #   p_t=p_space[current_idx]
        s[current_idx] += 1

        R[current_idx] = gain.resMed(current_idx + 1)[0]

        regret.append(regret[-1] +
                      (-gain.resMed(current_idx)[1] + gain_max) / arg[2])

        loc = np.argmin(np.abs(p_space - np.array(R[current_idx])))

        reward = p_space[loc]
        if reward in obs[current_idx]:
            obs[current_idx][reward] += 1
        else:
            obs[current_idx][reward] = 1
    # print(obs)
        t = t + 1
#==============================================================================
#         if not(np.mod(t,np.round(arg[2]/10.).astype(int))):
#             print('Progress: '+ repr(100.*t/arg[2]) + '%.')
#==============================================================================

    return np.asarray(regret[1:])
예제 #7
0
# -*- coding: utf-8 -*-

import numpy as np
import gain

# =============================================================================
#KL-UCB, VARIABLES DE DEMO
pt_discr = 10  # Nb de points pour discrétiser pour KL_UCB
c = 3  # reprise de code KL_UCB
# =============================================================================

gain_max = gain.resMed(0)[2]
#==============================================================================
#==============================================================================
# # Go KL-UCB...
#==============================================================================
#==============================================================================


def reseqp(p, V, klMax, max_iterations=50):
    """ Solve ``f(reseqp(p, V, klMax)) = klMax``, using Newton method.

    .. note:: This is a subroutine of :func:`maxEV`.

    - Reference: Eq. (4) in Section 3.2 of [Filippi, Cappé & Garivier - Allerton, 2011](https://arxiv.org/pdf/1004.5229.pdf).

    .. warning:: `np.dot` is very slow!
    """
    MV = np.max(V)
    mV = np.min(V)
    value = MV + 0.1
예제 #8
0
def Strategie_2(arg):

    T = arg[0]  #Nombre de tests total
    N = arg[1]  #Nombre de medicaments
    init = arg[2]
    alp = arg[3]

    intervalles = [[0, 1]]
    essais = [[0]]
    for i in range(N - 1):
        intervalles.append([0, 1])
        essais.append([0])

    regret = [0]
    int_a_tester = [True] * N
    choix = [0
             ] * N  #Compteur du nombre de fois ou on a teste chaque medicament
    trouve = False
    jetons_joues = 0

    e2 = 0

    while jetons_joues < init * N:
        for i in range(N):
            jetons_joues += 1
            essais[i].append(gain.resMed(i + 1)[0])
            regret.append(regret[-1] + (-gain.resMed(i + 1)[1] + gain_max) / T)
            choix[i] += 1
    for i in range(N):
        intervalles[i] = list(
            ssp.proportion_confint(sum(essais[i]),
                                   len(essais[i]) - 1,
                                   alpha=alp))

    while jetons_joues < T and not trouve:
        e2 += 1
        for i in range(len(intervalles)):
            if int_a_tester[i]:
                if intDisjInf(intervalles, i):
                    int_a_tester[i] = False
                elif intDisjSup(intervalles, i):
                    trouve = True
                    meilleur = i
                else:
                    if jetons_joues == T:
                        break
                    jetons_joues += 1
                    choix[i] += 1
                    essais[i].append(gain.resMed(i + 1)[0])
                    regret.append(regret[-1] +
                                  (-gain.resMed(i + 1)[1] + gain_max) / T)
                    intervalles[i] = list(
                        ssp.proportion_confint(sum(essais[i]),
                                               len(essais[i]) - 1,
                                               alpha=alp))

        if int_a_tester.count(True) == 1:
            meilleur = int_a_tester.index(True)
            trouve = True
            break

    while jetons_joues < T:
        regret.append(regret[-1] +
                      (-gain.resMed(meilleur + 1)[1] + gain_max) / T)
        jetons_joues += 1
        choix[meilleur] += 1

    return np.asarray(regret[1:]), choix
예제 #9
0
# -*- coding: utf-8 -*-

import numpy as np
import gain
import math
import statsmodels.stats.proportion as ssp

gain_max = gain.resMed(0)[2]  #Gain maximum pour le calcul de nos regrets


def Strategie_1(arg):

    T1 = arg[0]  #Nombre de jeton en phase d'exploration
    T = arg[1]  #Nombre de tests total
    N = arg[2]  #Nombre de medicaments

    n = T1 // N  #Nombre d'essais de chaque medicaments en phase d'exploration
    essais = [
    ]  #Contient un vecteur d'essais par medicament pour les T1 premiers lancers
    regret = [0]
    choix = [0
             ] * N  #Compteur du nombre de fois ou on a teste chaque medicament

    #On fait n essais pour chaque medicament qu'on range dans essais_machine
    for k in range(N):
        essai_machine = []
        for i in range(n):
            essai_machine.append(gain.resMed(k + 1)[0])
            choix[k] += 1
            regret.append(regret[-1] + (-gain.resMed(k + 1)[1] + gain_max) / T)