Skip to content

Instantly share code, notes, and snippets.

@pmbaumgartner
Created January 13, 2021 22:43
Show Gist options
  • Save pmbaumgartner/749b9f58aa9e74d5232ad27004d5ce34 to your computer and use it in GitHub Desktop.
Save pmbaumgartner/749b9f58aa9e74d5232ad27004d5ce34 to your computer and use it in GitHub Desktop.
TSSS Python
import numpy as np
import numba
@numba.njit()
def tsss(vec1, vec2):
euclidean_distance = np.linalg.norm(vec1 - vec2)
cosine_distance = np.dot(vec1, vec2.T) / (
np.linalg.norm(vec1) * np.linalg.norm(vec2)
)
magnitude_difference = abs(np.linalg.norm(vec1) - np.linalg.norm(vec2))
theta = np.arccos(cosine_distance) + np.radians(10.0)
triangle = (np.linalg.norm(vec1) * np.linalg.norm(vec2) * np.sin(theta)) / 2
sector = (
np.pi
* ((euclidean_distance + magnitude_difference) ** 2)
* (np.degrees(theta) / 360)
)
return triangle * sector
# Equation 7 From Paper
@numba.njit()
def tsss_eq7(vec1, vec2):
euclidean_distance = np.linalg.norm(vec1 - vec2)
cosine_distance = np.dot(vec1, vec2.T) / (
np.linalg.norm(vec1) * np.linalg.norm(vec2)
)
magnitude_difference = abs(np.linalg.norm(vec1) - np.linalg.norm(vec2))
theta = np.arccos(cosine_distance) + np.radians(10.0)
result = (
np.linalg.norm(vec1)
* np.linalg.norm(vec2)
* np.sin(theta)
* np.degrees(theta)
* np.pi
* ((euclidean_distance + magnitude_difference) ** 2)
) / 720
return result
for i in range(200):
vec1 = np.random.random(200)
vec2 = np.random.random(200)
sim1 = tsss(vec1, vec2)
sim2 = tsss_eq7(vec1, vec2)
assert sim1 >= 0, f"{sim1}"
assert sim2 >= 0, f"{sim2}"
assert np.isclose(sim1, sim2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment