def _erp_cost_matrix(x: np.ndarray, y: np.ndarray, bounding_matrix: np.ndarray, g: float): """Compute the erp cost matrix between two timeseries. Parameters ---------- x: np.ndarray (2d array) First timeseries. y: np.ndarray (2d array) Second timeseries. bounding_matrix: np.ndarray (2d of size mxn where m is len(x) and n is len(y)) Bounding matrix where the values in bound are marked by finite values and outside bound points are infinite values. g: float The reference value to penalise gaps ('gap' defined when an alignment to the next value (in x) in value can't be found). Returns ------- np.ndarray (2d of size mxn where m is len(x) and n is len(y)) Erp cost matrix between x and y. """ x_size = x.shape[0] y_size = y.shape[0] cost_matrix = np.zeros((x_size + 1, y_size + 1)) x_g = np.full_like(x[0], g) y_g = np.full_like(y[0], g) gx_distance = np.array( [abs(_local_euclidean_distance(x_g, ts)) for ts in x]) gy_distance = np.array( [abs(_local_euclidean_distance(y_g, ts)) for ts in y]) cost_matrix[1:, 0] = np.sum(gx_distance) cost_matrix[0, 1:] = np.sum(gy_distance) for i in range(1, x_size + 1): for j in range(1, y_size + 1): if np.isfinite(bounding_matrix[i - 1, j - 1]): cost_matrix[i, j] = min( cost_matrix[i - 1, j - 1] + _local_euclidean_distance(x[i - 1], y[j - 1]), cost_matrix[i - 1, j] + gx_distance[i - 1], cost_matrix[i, j - 1] + gy_distance[j - 1], ) return cost_matrix[1:, 1:]
def _edr_cost_matrix( x: np.ndarray, y: np.ndarray, bounding_matrix: np.ndarray, epsilon: float, ): """Compute the edr cost matrix between two timeseries. Parameters ---------- x: np.ndarray (2d array) First timeseries. y: np.ndarray (2d array) Second timeseries. bounding_matrix: np.ndarray (2d of size mxn where m is len(x) and n is len(y)) Bounding matrix where the values in bound are marked by finite values and outside bound points are infinite values. epsilon : float Matching threshold to determine if distance between two subsequences are considered similar (similar if distance less than the threshold). Returns ------- np.ndarray (2d of size mxn where m is len(x) and n is len(y)) Edr cost matrix between x and y. """ x_size = x.shape[0] y_size = y.shape[0] cost_matrix = np.zeros((x_size + 1, y_size + 1)) for i in range(1, x_size + 1): for j in range(1, y_size + 1): if np.isfinite(bounding_matrix[i - 1, j - 1]): curr_dist = _local_euclidean_distance(x[i - 1], y[j - 1]) if curr_dist < epsilon: cost = 0 else: cost = 1 cost_matrix[i, j] = min( cost_matrix[i - 1, j - 1] + cost, cost_matrix[i - 1, j] + 1, cost_matrix[i, j - 1] + 1, ) return cost_matrix[1:, 1:]