-
Notifications
You must be signed in to change notification settings - Fork 0
/
arm.py
47 lines (33 loc) · 1.92 KB
/
arm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np
class linucb_disjoint_arm():
def __init__(self, arm_index, d, alpha):
# Инциализируем индекс ручки
self.arm_index = arm_index
# Значение alpha, которое контролирует exploration
self.alpha = alpha
# A: (d x d) матрица = D_a.T * D_a + I_d.
# Обратная матрица A используется в ridge regression
self.A = np.identity(d)
# b: (d x 1) соответствующий вектор ответов.
# Равно значению D_a.T * c_a в формулировке ridge regression
self.b = np.zeros([d, 1])
def calc_UCB(self, x_array):
# Находим обратную матрицу к A для ridge regression
A_inv = np.linalg.inv(self.A)
# Выполняем ridge regression, чтобы получить оценку коэфициентов theta
# theta это вектор размерности (d x 1)
self.theta = np.dot(A_inv, self.b)
# Меняем форму входного вектора в вектор размерности (d x 1)
x = x_array.reshape([-1, 1])
# Находим ucb основываясь на формулировке (mean + std_dev)
# p это вектор размерности (1 x 1)
p = np.dot(self.theta.T, x) + self.alpha * np.sqrt(np.dot(x.T, np.dot(A_inv, x)))
return p
def reward_update(self, reward, x_array):
# Входной вектор в вектор размерности (d x 1)
x = x_array.reshape([-1, 1])
# Обновляем значения матрицы A размерности (d * d).
self.A += np.dot(x, x.T)
# Обновляем вектор b размерности (d x 1)
# reward скалярное значение
self.b += reward * x