Я пытаюсь решить относительно простую проблему с 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))