Source code for wormpose.pose.distance_metrics
"""
Contains function to calculate distances between worm poses, either represented as angles or as skeletons
"""
import math
import numpy as np
[docs]def angle_distance(theta_a: np.ndarray, theta_b: np.ndarray) -> float:
"""
Angle distance that takes into account the periodicity of angles
"""
diff = np.abs(np.arctan2(np.sin(theta_a - theta_b), np.cos(theta_a - theta_b)))
return diff.mean()
def _head_tail_diff(skel):
return skel[-1][0] - skel[0][0], skel[-1][1] - skel[0][1]
def _cos_similarity(a, b):
def _norm(x):
return math.sqrt(x[0] * x[0] + x[1] * x[1])
return (a[0] * b[0] + a[1] * b[1]) / (_norm(a) * _norm(b))
[docs]def skeleton_distance(skel_a: np.ndarray, skel_b: np.ndarray) -> float:
"""
Cosine similarity between the two head to tail vectors of the input skeletons
"""
return _cos_similarity(_head_tail_diff(skel_a), _head_tail_diff(skel_b))