85 lines
2.0 KiB
Python
85 lines
2.0 KiB
Python
import numpy as np
|
|
import scipy.signal
|
|
|
|
|
|
def discount(x, gamma):
|
|
"""
|
|
computes discounted sums along 0th dimension of x.
|
|
|
|
inputs
|
|
------
|
|
x: ndarray
|
|
gamma: float
|
|
|
|
outputs
|
|
-------
|
|
y: ndarray with same shape as x, satisfying
|
|
|
|
y[t] = x[t] + gamma*x[t+1] + gamma^2*x[t+2] + ... + gamma^k x[t+k],
|
|
where k = len(x) - t - 1
|
|
|
|
"""
|
|
assert x.ndim >= 1
|
|
return scipy.signal.lfilter([1],[1,-gamma],x[::-1], axis=0)[::-1]
|
|
|
|
def explained_variance(ypred,y):
|
|
"""
|
|
Computes fraction of variance that ypred explains about y.
|
|
Returns 1 - Var[y-ypred] / Var[y]
|
|
|
|
interpretation:
|
|
ev=0 => might as well have predicted zero
|
|
ev=1 => perfect prediction
|
|
ev<0 => worse than just predicting zero
|
|
|
|
"""
|
|
assert y.ndim == 1 and ypred.ndim == 1
|
|
vary = np.var(y)
|
|
return np.nan if vary==0 else 1 - np.var(y-ypred)/vary
|
|
|
|
def explained_variance_2d(ypred, y):
|
|
assert y.ndim == 2 and ypred.ndim == 2
|
|
vary = np.var(y, axis=0)
|
|
out = 1 - np.var(y-ypred)/vary
|
|
out[vary < 1e-10] = 0
|
|
return out
|
|
|
|
def ncc(ypred, y):
|
|
return np.corrcoef(ypred, y)[1,0]
|
|
|
|
def flatten_arrays(arrs):
|
|
return np.concatenate([arr.flat for arr in arrs])
|
|
|
|
def unflatten_vector(vec, shapes):
|
|
i=0
|
|
arrs = []
|
|
for shape in shapes:
|
|
size = np.prod(shape)
|
|
arr = vec[i:i+size].reshape(shape)
|
|
arrs.append(arr)
|
|
i += size
|
|
return arrs
|
|
|
|
def discount_with_boundaries(X, New, gamma):
|
|
"""
|
|
X: 2d array of floats, time x features
|
|
New: 2d array of bools, indicating when a new episode has started
|
|
"""
|
|
Y = np.zeros_like(X)
|
|
T = X.shape[0]
|
|
Y[T-1] = X[T-1]
|
|
for t in range(T-2, -1, -1):
|
|
Y[t] = X[t] + gamma * Y[t+1] * (1 - New[t+1])
|
|
return Y
|
|
|
|
def test_discount_with_boundaries():
|
|
gamma=0.9
|
|
x = np.array([1.0, 2.0, 3.0, 4.0], 'float32')
|
|
starts = [1.0, 0.0, 0.0, 1.0]
|
|
y = discount_with_boundaries(x, starts, gamma)
|
|
assert np.allclose(y, [
|
|
1 + gamma * 2 + gamma**2 * 3,
|
|
2 + gamma * 3,
|
|
3,
|
|
4
|
|
]) |