def test_log_post_pred_k(): np.random.seed(1) # Prior D = 10 m_0 = 5 * np.random.rand(D) - 2 k_0 = np.random.randint(15) v_0 = D + np.random.randint(5) S_0 = 2 * np.random.rand(D) + 3 prior = NIW(m_0=m_0, k_0=k_0, v_0=v_0, S_0=S_0) # Data N = 12 X = 5 * np.random.rand(N, D) - 1 # Setup GMM gmm = GaussianComponentsDiag(X, prior) for i in range(N): gmm.add_item(i, 0) # Calculate posterior by hand x = X[0] k_N = k_0 + N v_N = v_0 + N m_N = (k_0 * m_0 + N * X[:N].mean(axis=0)) / k_N S_N = S_0 + np.square( X[:N]).sum(axis=0) + k_0 * np.square(m_0) - k_N * np.square(m_N) var = S_N * (k_N + 1) / (k_N * v_N) expected_posterior = np.sum([ students_t(x[i], m_N[i], S_N[i] * (k_N + 1) / (k_N * v_N), v_N) for i in range(len(x)) ]) npt.assert_almost_equal(gmm.log_post_pred_k(0, 0), expected_posterior)
def test_log_post_pred_k(): np.random.seed(1) # Prior D = 10 m_0 = 5*np.random.rand(D) - 2 k_0 = np.random.randint(15) v_0 = D + np.random.randint(5) S_0 = 2*np.random.rand(D) + 3 prior = NIW(m_0=m_0, k_0=k_0, v_0=v_0, S_0=S_0) # Data N = 12 X = 5*np.random.rand(N, D) - 1 # Setup GMM gmm = GaussianComponentsDiag(X, prior) for i in range(N): gmm.add_item(i, 0) # Calculate posterior by hand x = X[0] k_N = k_0 + N v_N = v_0 + N m_N = (k_0*m_0 + N*X[:N].mean(axis=0))/k_N S_N = S_0 + np.square(X[:N]).sum(axis=0) + k_0*np.square(m_0) - k_N*np.square(m_N) var = S_N*(k_N + 1)/(k_N*v_N) expected_posterior = np.sum( [students_t(x[i], m_N[i], S_N[i]*(k_N + 1)/(k_N*v_N), v_N) for i in range(len(x))] ) npt.assert_almost_equal(gmm.log_post_pred_k(0, 0), expected_posterior)
def test_del_item(): np.random.seed(1) # Prior D = 10 m_0 = 5 * np.random.rand(D) - 2 k_0 = np.random.randint(15) v_0 = D + np.random.randint(5) S_0 = 2 * np.random.rand(D) + 3 prior = NIW(m_0=m_0, k_0=k_0, v_0=v_0, S_0=S_0) # Data N = 12 X = 5 * np.random.rand(N, D) - 1 # Setup GMM gmm = GaussianComponentsDiag(X, prior) for i in range(N): gmm.add_item(i, 0) # Remove 5 random items del_items = set(np.random.randint(1, N, size=5)) for i in del_items: gmm.del_item(i) indices = list(set(range(N)).difference(del_items)) # Calculate posterior by hand X = X[indices] N, _ = X.shape x = X[0] k_N = k_0 + N v_N = v_0 + N m_N = (k_0 * m_0 + N * X[:N].mean(axis=0)) / k_N S_N = S_0 + np.square( X[:N]).sum(axis=0) + k_0 * np.square(m_0) - k_N * np.square(m_N) var = S_N * (k_N + 1) / (k_N * v_N) expected_posterior = np.sum([ students_t(x[i], m_N[i], S_N[i] * (k_N + 1) / (k_N * v_N), v_N) for i in range(len(x)) ]) npt.assert_almost_equal(gmm.log_post_pred_k(0, 0), expected_posterior)
def test_del_item(): np.random.seed(1) # Prior D = 10 m_0 = 5*np.random.rand(D) - 2 k_0 = np.random.randint(15) v_0 = D + np.random.randint(5) S_0 = 2*np.random.rand(D) + 3 prior = NIW(m_0=m_0, k_0=k_0, v_0=v_0, S_0=S_0) # Data N = 12 X = 5*np.random.rand(N, D) - 1 # Setup GMM gmm = GaussianComponentsDiag(X, prior) for i in range(N): gmm.add_item(i, 0) # Remove 5 random items del_items = set(np.random.randint(1, N, size=5)) for i in del_items: gmm.del_item(i) indices = list(set(range(N)).difference(del_items)) # Calculate posterior by hand X = X[indices] N, _ = X.shape x = X[0] k_N = k_0 + N v_N = v_0 + N m_N = (k_0*m_0 + N*X[:N].mean(axis=0))/k_N S_N = S_0 + np.square(X[:N]).sum(axis=0) + k_0*np.square(m_0) - k_N*np.square(m_N) var = S_N*(k_N + 1)/(k_N*v_N) expected_posterior = np.sum( [students_t(x[i], m_N[i], S_N[i]*(k_N + 1)/(k_N*v_N), v_N) for i in range(len(x))] ) npt.assert_almost_equal(gmm.log_post_pred_k(0, 0), expected_posterior)