-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgpr_kernel.py
More file actions
79 lines (66 loc) · 3.1 KB
/
gpr_kernel.py
File metadata and controls
79 lines (66 loc) · 3.1 KB
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
import numpy as np
class GPR_KERNEL:
def __init__(self, kernel_dict):
self.kernel_type = kernel_dict['Name']
self.alpharq = None
self.sigmaf = None
self.sigmal = None
self.length_scale = None
if self.kernel_type == 'ARDRationalQuadratic':
self.start_kernel_ARDRationalQuadratic(kernel_dict)
if self.kernel_type == 'RationalQuadratic':
self.start_kernel_RationalQuadratic(kernel_dict)
# print('Kernel alpha:',self.alpharq)
# print('Kernel sigma F :',self.sigmaf)
# print('Kernel lscale :', self.length_scale)
def start_kernel_RationalQuadratic(self, kernel_dict):
self.alpharq = kernel_dict['AlphaRQ']
self.sigmaf = kernel_dict['SigmaF']
self.sigmal = kernel_dict['SigmaL']
def start_kernel_ARDRationalQuadratic(self, kernel_dict):
self.alpharq = kernel_dict['AlphaRQ']
self.sigmaf = kernel_dict['SigmaF']
predictors_added = False
index_predictor = 1
self.length_scale = []
while not predictors_added:
key = f'LengthScale{index_predictor}'
if key in kernel_dict:
self.length_scale.append(kernel_dict[key])
else:
predictors_added = True
index_predictor = index_predictor + 1
def compute_kernel(self, vector1, vector2):
if self.kernel_type == 'ARDRationalQuadratic':
return self.compute_ard_rational_quadratic(vector1, vector2)
if self.kernel_type == 'RationalQuadratic':
return self.compute_rational_quadratic(vector1, vector2)
def compute_rational_quadratic(self,vector1,vector2):
if len(vector1) != len(vector2):
print('[WARNING] Kernel can not be computed, both vectors must have the same length')
return np.NaN
result = (self.sigmaf ** 2) * ((1 + (np.sum((vector1-vector2)**2)/(2*self.alpharq*(self.sigmal**2))))**-self.alpharq)
return result
def compute_ard_rational_quadratic(self, vector1, vector2):
if len(vector1) != len(vector2):
print('[WARNING] Kernel can not be computed, both vectors must have the same length')
return np.NaN
if len(vector1) != len(self.length_scale):
print(
f'[WARNING] ARD Rational Quadratic Kernel can not be computed, input vectors must have a length = {len(self.length_scale)}')
return np.NaN
# IN TWO LINES
sum = np.sum(np.power((vector1 - vector2), 2) / np.power(self.length_scale, 2))
result = (self.sigmaf ** 2) * ((1 + ((1 / (2 * self.alpharq)) * sum)) ** -self.alpharq)
##to check:
# https://it.mathworks.com/help/stats/kernel-covariance-function-options.html
# STEP BY STEP
# sum = 0
# nvec = len(vector1)
# for idx in range(nvec):
# sum = sum + ((vector1[idx] - vector2[idx]) ** 2) / (self.length_scale[idx] ** 2)
# coef = 1 / (2 * self.alpharq)
# val = 1 + (coef * sum)
# valp = val ** -self.alpharq
# result = (self.sigmaf ** 2) * valp
return result