summaryrefslogtreecommitdiff
path: root/ml_exp/kernels.py
diff options
context:
space:
mode:
authorDavid Luevano Alvarado <55825613+luevano@users.noreply.github.com>2020-02-29 09:06:54 -0700
committerDavid Luevano Alvarado <55825613+luevano@users.noreply.github.com>2020-02-29 09:06:54 -0700
commitda6b1428cda40534b820642d8e9be398d7fee8be (patch)
tree394de3268190dce5cff9367c2355c64101164863 /ml_exp/kernels.py
parent759b48a965470ac18910951b2cb0599d371d1808 (diff)
Rewrite kernel, gotta fix adj mat
Diffstat (limited to 'ml_exp/kernels.py')
-rw-r--r--ml_exp/kernels.py25
1 files changed, 18 insertions, 7 deletions
diff --git a/ml_exp/kernels.py b/ml_exp/kernels.py
index 3914ffc20..e6855f97e 100644
--- a/ml_exp/kernels.py
+++ b/ml_exp/kernels.py
@@ -26,20 +26,31 @@ import numpy as np
def gaussian_kernel(X1,
X2,
- sigma):
+ sigma,
+ opt=True):
"""
Calculates the Gaussian Kernel.
X1: first representations.
X2: second representations.
sigma: kernel width.
+ opt: if the optimized algorithm should be used. For benchmarking purposes.
"""
- inv_sigma = -0.5 / (sigma*sigma)
+ i_sigma = -0.5 / (sigma*sigma)
K = np.zeros((X1.shape[0], X2.shape[0]), dtype=float)
- for i, x1 in enumerate(X1):
- for j, x2 in enumerate(X2):
- f_norm = np.linalg.norm(x1 - x2)
- # print(f_norm)
- K[i, j] = math.exp(inv_sigma * f_norm)
+ if opt:
+ # Faster way of calculating the kernel.
+ for i, x1 in enumerate(X1):
+ if X2.ndim == 3:
+ norm = np.linalg.norm(X2 - x1, axis=(1, 2))
+ else:
+ norm = np.linalg.norm(X2 - x1, axis=-1)
+ K[i, :] = np.exp(i_sigma * np.square(norm))
+ else:
+ for i, x1 in enumerate(X1):
+ for j, x2 in enumerate(X2):
+ f_norm = np.linalg.norm(x2 - x1)
+ # print(f_norm)
+ K[i, j] = math.exp(i_sigma * f_norm**2)
return K