forked from pietermarsman/Streaming-Contextual-Bandits
-
Notifications
You must be signed in to change notification settings - Fork 0
/
regression.py
56 lines (48 loc) · 1.51 KB
/
regression.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
import random
from scipy.special._ufuncs import expit
import numpy as np
from misc import add_dict
__author__ = 'pieter'
random_coef = lambda: (random.random() - .5) * 0.1
def streaming_lr(t, x_t, y_t, betas, alpha, mu, invscaling=False):
if betas is None:
if len(x_t.shape) > 0:
betas = np.zeros(x_t.shape[0])
else:
betas = np.array(0.)
p = expit(betas.dot(x_t))
alpha = alpha / pow(t, invscaling) if invscaling else alpha
betas *= (1 - 2. * alpha * mu)
betas += alpha * (y_t - p) * x_t
return betas, alpha
def lr_predict(x, weights, i, learnrate, regulizer, default_value=None):
"""
Predict value using logistic regression
:param t:
:param x:
:param param:
:return:
"""
if default_value is None:
default_value = lambda: None
value = weights.get("intercept", default_value())
for key in x:
value += weights.get(key, default_value()) * x[key]
value *= (1. - 2. * learnrate * regulizer) ** i
return expit(value)
def lsr_update(t, y, x, weights, learnrate, default_value=None):
"""
Update values using logistic streaming regression
:param t: target
:param y: output
:param x: input
:param weights:
:return:
"""
if default_value is None:
default_value = lambda: None
error = t - y
add_dict(weights, "intercept", learnrate * error, default_value())
for key in x:
add_dict(weights, key, learnrate * error * x[key], default_value())
return weights