Автоград и софтмакс выбор - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь решить относительно простую проблему с autograd. Предположим, что в каждой зоне есть n зон и два источника информации о награде (f_prior, f_source). Лица, принимающие решения, вычисляют средневзвешенное значение двух, параметризованное альфа, и решают, где go использовать вероятности softmax. Однажды посетив ее, она может наблюдать настоящую награду, f_true. Исходя из абсолютной потери, она решает обновить альфа.

Я реализовал этот пример ниже, используя пакет autograd. Но он выдает

TypeError: float() argument must be a string or a number, not 'ArrayBox'

Проблема с функцией np.random.choice, но я понятия не имею, как это исправить.

import autograd 
import autograd.numpy as np 
from autograd import grad 
import autograd.numpy.random as npr
from autograd.misc import flatten 
from autograd.extend import primitive, defvjp
from autograd.misc.optimizers import sgd 

import matplotlib.pyplot as plt 
npr.random.seed = 1

zones = np.arange(0,70)
n_zones = zones.shape[0]
print(n_zones)
f_prior =  npr.rand(n_zones)
f_source =  npr.rand(n_zones)
f_true = npr.rand(n_zones)
alpha = 0.5

def weighted_f(alpha):
    f = alpha * f_true + (1-alpha) * f_prior
    return f



def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0) # on

def softmax2(x):

    return np.exp(x)/ np.sum(np.exp(x), axis=0) 

def cost(alpha):
    '''
    f_bar is a list of fares 

    '''
    f_bar = weighted_f(alpha)
    # print("f_bar " + str(f_bar))
    # print("softmax", softmax(f_bar), np.sum(softmax(f_bar)))

    zone = choose_zone(f_bar)
    # print("zone ", zone)
    # print("f_true[zone]", f_true[zone])
    # print("f_bar[zone]", f_bar[zone])
    return np.abs(f_true[zone] - f_bar[zone])


def choose_zone(f):
    ''' 
    f is a list of utilities  
    '''
    # return zones[np.argmax(f)]

    p = softmax(f)
    return np.random.choice(zones, 1, p = p)

# Find the gradient of the cost function using Autograd
grad_cost = grad(cost) 

num_epochs = 1000  # Number of epochs of training
lr = 0.1       # Learning rate

for i in range(num_epochs):
    # Evaluate the gradient of the current parameters stored in params

    # Update parameters w and b
    alpha = alpha - lr * grad_cost(alpha)
    # params['b'] = params['b'] - alpha * cost_params['b']

# print(alpha)



if __name__ == '__main__':
    print((alpha))
...