-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathBOCD_modules.py
64 lines (50 loc) · 3.47 KB
/
BOCD_modules.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from __future__ import division
import numpy as np
import sys
#-------------------------------------------------------------------------------------------------------------------
# Building the piece-wise stationary Bernoulli distributions
#-------------------------------------------------------------------------------------------------------------------
def constructEnvironment(environment, Period):
vect = np.array([])
for periode in range(environment.size):
vect = np.append(vect, environment[periode]*np.ones((Period)))
return vect
#-------------------------------------------------------------------------------------------------------------------
# Updating the forecaster distribution using the message passing algorithm
#-------------------------------------------------------------------------------------------------------------------
def updateForecasterDistribution(ForecasterDistribution, alphas, betas, reward, gamma):
if reward == 1:
likelihood = np.divide(alphas, alphas + betas)
else:
likelihood = np.divide(betas, alphas + betas)
ForecasterDistribution0 = gamma*np.dot(likelihood, np.transpose(ForecasterDistribution)) # Creating new Forecaster
ForecasterDistribution = (1-gamma)*likelihood*ForecasterDistribution # update the previous forecasters
ForecasterDistribution = np.append(ForecasterDistribution,ForecasterDistribution0) # Including the new forecaseter into the previons ones
ForecasterDistribution = ForecasterDistribution/np.sum(ForecasterDistribution) # Normalization for numerical purposes
return ForecasterDistribution
#-------------------------------------------------------------------------------------------------------------------
# Updating the forecaster distribution using the message passing algorithm with a modified prior (q)
#-------------------------------------------------------------------------------------------------------------------
def updateForecasterDistribution_m(ForecasterDistribution, PseudoDist, alphas, betas, reward, gamma, like1):
if reward == 1:
likelihood = np.divide(alphas, alphas + betas)
else:
likelihood = np.divide(betas, alphas + betas)
Pseudo_w0 = gamma*like1*np.sum(PseudoDist) # Using the simple prior
PseudoDist = like1*PseudoDist
ForecasterDistribution0 = Pseudo_w0 # Creating new Forecaster
ForecasterDistribution = (1-gamma)*likelihood*ForecasterDistribution # update the previous forecasters
ForecasterDistribution = np.append(ForecasterDistribution,ForecasterDistribution0) # Including the new forecaseter into the previons ones
ForecasterDistribution = ForecasterDistribution/np.sum(ForecasterDistribution) # Normalization for numerical purposes
PseudoDist = np.append(PseudoDist,Pseudo_w0)
PseudoDist = PseudoDist/np.sum(PseudoDist) # Normalization for numerical purposes
return ForecasterDistribution, PseudoDist, like1
#-------------------------------------------------------------------------------------------------------------------
# Updating the laplace prediction for each forecasters
#-------------------------------------------------------------------------------------------------------------------
def updateLaplacePrediction(alphas, betas, x):
alphas[:] += x
betas[:] += (1-x)
alphas = np.append(alphas,1) # Creating new Forecaster
betas = np.append(betas,1) # Creating new Forecaster
return alphas, betas