def test_cardinality(self): def delannoy(m, n): s = 0 for k in range(min(m, n) + 1): s += binom(m, k) * binom(n, k) * 2**k return s for size_X in (1, 2, 3): for size_Y in (1, 2, 3, 4): card = cardinality(size_X, size_Y) card2 = len(list(alignment_matrices(size_X, size_Y))) assert_equal(card, card2) assert_equal(card, delannoy(size_X - 1, size_Y - 1))
def test_mean_cost_grad(self): X, Y = _make_time_series(size_X=3, size_Y=4, num_dim=2) C = squared_euclidean_cost(X, Y) A_sum = np.zeros_like(C) n = 0 for A in alignment_matrices(*C.shape): A_sum += A n += 1 A_mean1 = A_sum / n A_mean2 = mean_cost_value_and_grad_C(C)[1] assert_array_almost_equal(A_mean1, A_mean2) G = _num_gradient(mean_cost_C, A_sum) # Any matrix can be used. assert_array_almost_equal(A_mean1, G)
def test_mean_cost(self): X, Y = _make_time_series(size_X=3, size_Y=4, num_dim=2) C = squared_euclidean_cost(X, Y) scores = [] for A in alignment_matrices(*C.shape): scores.append(np.vdot(A, C)) val1 = np.mean(scores) val2 = mean_cost_C(C) val3 = mean_cost_value_and_grad_C(C)[0] val4 = mean_cost(X, Y) val5 = mean_cost_value_and_grad(X, Y)[0] assert_almost_equal(val1, val2) assert_almost_equal(val1, val3) assert_almost_equal(val1, val4) assert_almost_equal(val1, val5)
def _expectation_brute_force(C, gamma=1.0): p = _probas(C, gamma=gamma) E = np.zeros_like(C) for i, A in enumerate(alignment_matrices(*C.shape)): E += p[i] * A return E
def _probas(C, gamma=1.0): scores = [] for A in alignment_matrices(*C.shape): scores.append(np.vdot(A, C)) scores = np.array(scores) return softmax(-scores / gamma)
def _sdtw_brute_force(C, gamma=1.0): scores = [] for A in alignment_matrices(*C.shape): scores.append(np.vdot(A, C)) scores = np.array(scores) return -gamma * logsumexp(-scores / gamma)