def s_erp(t0, t1, g): """ Usage ----- The Edit distance with Real Penalty between trajectory t0 and t1. Parameters ---------- param t0 : len(t0)x2 numpy_array param t1 : len(t1)x2 numpy_array Returns ------- dtw : float The Dynamic-Time Warping distance between trajectory t0 and t1 """ n0 = len(t0) n1 = len(t1) C = np.zeros((n0 + 1, n1 + 1)) C[1:, 0] = sum( map(lambda x: abs(great_circle_distance(g[0], g[1], x[0], x[1])), t0)) C[0, 1:] = sum( map(lambda y: abs(great_circle_distance(g[0], g[1], y[0], y[1])), t1)) for i in np.arange(n0) + 1: for j in np.arange(n1) + 1: derp0 = C[i - 1, j] + great_circle_distance( t0[i - 1][0], t0[i - 1][1], g[0], g[1]) derp1 = C[i, j - 1] + great_circle_distance( g[0], g[1], t1[j - 1][0], t1[j - 1][1]) derp01 = C[i - 1, j - 1] + great_circle_distance( t0[i - 1][0], t0[i - 1][1], t1[j - 1][0], t1[j - 1][1]) C[i, j] = min(derp0, derp1, derp01) erp = C[n0, n1] return erp
def s_sspd(t0, t1): """ Usage ----- The sspd-distance between trajectories t1 and t2. The sspd-distance is the mean of the spd-distance between of t1 from t2 and the spd-distance of t2 from t1. Parameters ---------- param t0 : len(t0)x2 numpy_array param t1 : len(t1)x2 numpy_array Returns ------- sspd : float sspd-distance of trajectory t2 from trajectory t1 """ n0 = len(t0) n1 = len(t1) lats0 = t0[:, 1] lons0 = t0[:, 0] lats1 = t1[:, 1] lons1 = t1[:, 0] mdist = great_circle_distance_traj(lons0, lats0, lons1, lats1, n0, n1) t0_dist = map(lambda it0: great_circle_distance(lons0[it0], lats0[it0], lons0[it0 + 1], lats0[it0 + 1]), range(n0 - 1)) t1_dist = map(lambda it1: great_circle_distance(lons1[it1], lats1[it1], lons1[it1 + 1], lats1[it1 + 1]), range(n1 - 1)) dist = s_spd(lons0, lats0, lons1, lats1, n0, n1, mdist, t0_dist) + s_spd(lons1, lats1, lons0, lats0, n1, n0, mdist.T, t1_dist) return dist
def s_dtw(t0, t1): """ Usage ----- The Dynamic-Time Warping distance between trajectory t0 and t1. Parameters ---------- param t0 : len(t0)x2 numpy_array param t1 : len(t1)x2 numpy_array Returns ------- dtw : float The Dynamic-Time Warping distance between trajectory t0 and t1 """ n0 = len(t0) n1 = len(t1) C = np.zeros((n0 + 1, n1 + 1)) C[1:, 0] = float('inf') C[0, 1:] = float('inf') for i in np.arange(n0) + 1: for j in np.arange(n1) + 1: C[i, j] = great_circle_distance(t0[i - 1][0], t0[i - 1][1], t1[j - 1][0], t1[j - 1][1]) + \ min(C[i, j - 1], C[i - 1, j - 1], C[i - 1, j]) dtw = C[n0, n1] return dtw
def s_edr(t0, t1, eps): """ Usage ----- The Edit Distance on Real sequence between trajectory t0 and t1. Parameters ---------- param t0 : len(t0)x2 numpy_array param t1 : len(t1)x2 numpy_array eps : float Returns ------- edr : float The Longuest-Common-Subsequence distance between trajectory t0 and t1 """ n0 = len(t0) n1 = len(t1) # An (m+1) times (n+1) matrix C = [[0] * (n1 + 1) for _ in range(n0 + 1)] for i in range(1, n0 + 1): for j in range(1, n1 + 1): if great_circle_distance(t0[i - 1][0], t0[i - 1][1], t1[j - 1][0], t1[j - 1][1]) < eps: subcost = 0 else: subcost = 1 C[i][j] = min(C[i][j - 1] + 1, C[i - 1][j] + 1, C[i - 1][j - 1] + subcost) edr = float(C[n0][n1]) / max([n0, n1]) return edr
def s_lcss(t0, t1, eps): """ Usage ----- The Longuest-Common-Subsequence distance between trajectory t0 and t1. Parameters ---------- param t0 : len(t0)x2 numpy_array param t1 : len(t1)x2 numpy_array eps : float Returns ------- lcss : float The Longuest-Common-Subsequence distance between trajectory t0 and t1 """ n0 = len(t0) n1 = len(t1) # An (m+1) times (n+1) matrix C = [[0] * (n1 + 1) for _ in range(n0 + 1)] for i in range(1, n0 + 1): for j in range(1, n1 + 1): if great_circle_distance(t0[i - 1, 0], t0[i - 1, 1], t1[j - 1, 0], t1[j - 1, 1]) < eps: C[i][j] = C[i - 1][j - 1] + 1 else: C[i][j] = max(C[i][j - 1], C[i - 1][j]) lcss = 1 - float(C[n0][n1]) / min([n0, n1]) return lcss
def s_hausdorff(t0, t1): """ Usage ----- hausdorff distance between trajectories t1 and t2. Parameters ---------- param lons0 : n0 x 1 numpy_array, longitudes of trajectories t0 param lats0 : n0 x 1 numpy_array, lattitudes of trajectories t0 param lons1 : n1 x 1 numpy_array, longitudes of trajectories t1 param lats1 : n1 x 1 numpy_array, lattitudes of trajectories t1 param n0: int, length of lons0 and lats0 param n1: int, length of lons1 and lats1 mdist : len(t0) x len(t1) numpy array, pairwise distance between points of trajectories t0 and t1 param t0_dist: l_t1 x 1 numpy_array, distances between consecutive points in t0 Returns ------- h : float, hausdorff from trajectories t1 and t2 """ n0 = len(t0) n1 = len(t1) lats0 = t0[:, 1] lons0 = t0[:, 0] lats1 = t1[:, 1] lons1 = t1[:, 0] mdist = great_circle_distance_traj(lons0, lats0, lons1, lats1, n0, n1) t0_dist = map( lambda it0: great_circle_distance(lons0[it0], lats0[it0], lons0[ it0 + 1], lats0[it0 + 1]), range(n0 - 1)) t1_dist = map( lambda it1: great_circle_distance(lons1[it1], lats1[it1], lons1[ it1 + 1], lats1[it1 + 1]), range(n1 - 1)) h = max( s_directed_hausdorff(lons0, lats0, lons1, lats1, n0, n1, mdist, t0_dist), s_directed_hausdorff(lons1, lats1, lons0, lats0, n1, n0, mdist.T, t1_dist)) return h