-
Notifications
You must be signed in to change notification settings - Fork 0
/
exp2_2D_regression.py
113 lines (85 loc) · 4.17 KB
/
exp2_2D_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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import numpy as np
import tensorflow as tf
from scipy.stats import truncnorm
X_LOW = -5
X_HIGH = 5
Y_HIGH = 2.5
Y_LOW = -2.5
class MetaDataset:
def __init__(self, random_state=None):
if random_state is None:
self.random_state = np.random
else:
self.random_state = random_state
def generate_meta_train_data(self, n_tasks: int, n_samples: int) -> list:
raise NotImplementedError
def generate_meta_test_data(self, n_tasks: int, n_samples_context: int, n_samples_test: int) -> list:
raise NotImplementedError
class CauchyMetaDataset(MetaDataset):
def __init__(self, noise_std=0.05, ndim_x=2, random_state=None):
self.noise_std = noise_std
self.ndim_x = ndim_x
super().__init__(random_state)
def generate_meta_train_data(self, n_tasks, n_samples):
meta_train_tuples = []
for i in range(n_tasks):
X = truncnorm.rvs(-3, 2, loc=0, scale=2.5, size=(n_samples, self.ndim_x),
random_state=self.random_state)
Y = self._gp_fun_from_prior(X)
meta_train_tuples.append((X, Y))
return meta_train_tuples
def generate_meta_test_data(self, n_tasks, n_samples_context, n_samples_test):
assert n_samples_test > 0
meta_test_tuples = []
for i in range(n_tasks):
X = truncnorm.rvs(-3, 2, loc=0, scale=2.5, size=(n_samples_context + n_samples_test, self.ndim_x),
random_state=self.random_state)
Y = self._gp_fun_from_prior(X)
meta_test_tuples.append(
(X[:n_samples_context], Y[:n_samples_context], X[n_samples_context:], Y[n_samples_context:]))
return meta_test_tuples
def _mean(self, x):
loc1 = -1 * np.ones(x.shape[-1])
loc2 = 2 * np.ones(x.shape[-1])
cauchy1 = 1 / (np.pi * (1 + (np.linalg.norm(x - loc1, axis=-1)) ** 2))
cauchy2 = 1 / (np.pi * (1 + (np.linalg.norm(x - loc2, axis=-1)) ** 2))
return 6 * cauchy1 + 3 * cauchy2 + 1
def _gp_fun_from_prior(self, X):
assert X.ndim == 2
n = X.shape[0]
def kernel(a, b, lengthscale):
sqdist = np.sum(a ** 2, 1).reshape(-1, 1) + np.sum(b ** 2, 1) - 2 * np.dot(a, b.T)
return np.exp(-.5 * (1 / lengthscale) * sqdist)
K_ss = kernel(X, X, 0.5)
L = np.linalg.cholesky(K_ss + 1e-8 * np.eye(n))
f = self._mean(X) + np.dot(L, self.random_state.normal(scale=0.2, size=(n, 1))).flatten()
y = f + self.random_state.normal(scale=self.noise_std, size=f.shape)
return y.reshape(-1, 1)
def provide_data(dataset, seed=28, n_train_tasks=None, n_samples=None, config=None):
import numpy as np
N_TEST_TASKS = 20
N_VALID_TASKS = 20
N_TEST_SAMPLES = 200
# if specified, overwrite default settings
if config is not None:
if config['num_test_valid_tasks'] is not None: N_TEST_TASKS = config['num_test_valid_tasks']
if config['num_test_valid_tasks'] is not None: N_VALID_TASKS = config['num_test_valid_tasks']
if config['num_test_valid_samples'] is not None: N_TEST_SAMPLES = config['num_test_valid_samples']
elif 'cauchy' in dataset:
if len(dataset.split('_')) == 2:
n_train_tasks = int(dataset.split('_')[-1])
dataset = CauchyMetaDataset(random_state=np.random.RandomState(seed + 1))
if n_samples is None:
n_train_samples = n_context_samples = 20
else:
n_train_samples = n_context_samples = n_samples
if n_train_tasks is None: n_train_tasks = 20
else:
raise NotImplementedError('Does not recognize dataset flag')
data_train = dataset.generate_meta_train_data(n_tasks=n_train_tasks, n_samples=n_train_samples)
data_test_valid = dataset.generate_meta_test_data(n_tasks=N_TEST_TASKS + N_VALID_TASKS,
n_samples_context=n_context_samples,
n_samples_test=N_TEST_SAMPLES)
data_valid = data_test_valid[N_VALID_TASKS:]
data_test = data_test_valid[:N_VALID_TASKS]
return data_train, data_valid, data_test