def test_csp_base(): p, n = 8, 100 X_a = np.random.randn(p, n) X_b = np.random.randn(p, n) C_a = np.cov(X_a) C_b = np.cov(X_b) W = sf.csp_base(C_a, C_b) assert W.shape == (p, p) # Use W X X^T W^T ~ W C W^T to extract projected (co)variance: D_a = reduce(np.dot, [W, C_a, W.T]) D_b = reduce(np.dot, [W, C_b, W.T]) # W C W^T = I: np.testing.assert_almost_equal(D_a + D_b, np.eye(W.shape[1]), err_msg='Joint covariance is not the identity matrix.') # W C_a W^T = D: np.testing.assert_almost_equal(np.diag(np.diag(D_a)), D_a, err_msg='Class covariance is not diagonal.') # D_ii < D_(i+1, i+1) with D = D_a: assert np.all(np.diff(np.diag(D_a)) >= 0), \ 'Class variance is not ascending.'
def test_csp_base(): p, n = 8, 100 X_a = np.random.randn(p, n) X_b = np.random.randn(p, n) C_a = np.cov(X_a) C_b = np.cov(X_b) W = sf.csp_base(C_a, C_b) assert W.shape == (p, p) # Use W X X^T W^T ~ W C W^T to extract projected (co)variance: D_a = reduce(np.dot, [W, C_a, W.T]) D_b = reduce(np.dot, [W, C_b, W.T]) # W C W^T = I: np.testing.assert_almost_equal( D_a + D_b, np.eye(W.shape[1]), err_msg="Joint covariance is not the identity matrix." ) # W C_a W^T = D: np.testing.assert_almost_equal(np.diag(np.diag(D_a)), D_a, err_msg="Class covariance is not diagonal.") # D_ii < D_(i+1, i+1) with D = D_a: assert np.all(np.diff(np.diag(D_a)) >= 0), "Class variance is not ascending."
def test_csp(): p, n = 8, 100 X_a = np.random.randn(p, n) X_b = np.random.randn(p, n) C_a = np.cov(X_a) C_b = np.cov(X_b) W_full = sf.csp_base(C_a, C_b) W = sf.csp(C_a, C_b, 7) np.testing.assert_equal(W, W_full[[0, 1, 2, 3, -3, -2, -1]])