Example #1
0
    def test_composition(self):
        X, Y, Z = axes3d.get_test_data(1.2)

        data_matrix = [Z.T]
        sample_points = [X[0, :], Y[:, 0]]

        g = FDataGrid(data_matrix, sample_points)
        self.assertEqual(g.dim_domain, 2)
        self.assertEqual(g.dim_codomain, 1)

        t = np.linspace(0, 2 * np.pi, 100)

        data_matrix = [10 * np.array([np.cos(t), np.sin(t)]).T]
        f = FDataGrid(data_matrix, t)
        self.assertEqual(f.dim_domain, 1)
        self.assertEqual(f.dim_codomain, 2)

        gof = g.compose(f)
        self.assertEqual(gof.dim_domain, 1)
        self.assertEqual(gof.dim_codomain, 1)
Example #2
0
class TestWarping(unittest.TestCase):
    """Test warpings functions"""
    def setUp(self):
        """Initialization of samples"""

        self.time = np.linspace(-1, 1, 50)
        interpolation = SplineInterpolation(3, monotone=True)
        self.polynomial = FDataGrid([self.time**3, self.time**5],
                                    self.time,
                                    interpolation=interpolation)

    def test_invert_warping(self):

        inverse = invert_warping(self.polynomial)

        # Check if identity
        id = self.polynomial.compose(inverse)

        np.testing.assert_array_almost_equal([self.time, self.time],
                                             id.data_matrix[..., 0],
                                             decimal=3)

    def test_standard_normalize_warping(self):
        """Test normalization to (0, 1)"""

        normalized = normalize_warping(self.polynomial, (0, 1))

        # Test new domain range (0, 1)
        np.testing.assert_array_equal(normalized.domain_range, [(0, 1)])

        np.testing.assert_array_almost_equal(normalized.grid_points[0],
                                             np.linspace(0, 1, 50))

        np.testing.assert_array_almost_equal(
            normalized(0)[..., 0], [[0.], [0.]])

        np.testing.assert_array_almost_equal(
            normalized(1)[..., 0], [[1.], [1.]])

    def test_standard_normalize_warping_default_value(self):
        """Test normalization """

        normalized = normalize_warping(self.polynomial)

        # Test new domain range (0, 1)
        np.testing.assert_array_equal(normalized.domain_range, [(-1, 1)])

        np.testing.assert_array_almost_equal(normalized.grid_points[0],
                                             np.linspace(-1, 1, 50))

        np.testing.assert_array_almost_equal(
            normalized(-1)[..., 0], [[-1], [-1]])

        np.testing.assert_array_almost_equal(
            normalized(1)[..., 0], [[1.], [1.]])

    def test_normalize_warping(self):
        """Test normalization to (a, b)"""
        a = -4
        b = 3
        domain = (a, b)
        normalized = normalize_warping(self.polynomial, domain)

        # Test new domain range (0, 1)
        np.testing.assert_array_equal(normalized.domain_range, [domain])

        np.testing.assert_array_almost_equal(normalized.grid_points[0],
                                             np.linspace(*domain, 50))

        np.testing.assert_array_equal(normalized(a)[..., 0], [[a], [a]])

        np.testing.assert_array_equal(normalized(b)[..., 0], [[b], [b]])

    def test_landmark_shift_deltas(self):

        fd = make_multimodal_samples(n_samples=3, random_state=1)
        landmarks = make_multimodal_landmarks(n_samples=3, random_state=1)
        landmarks = landmarks.squeeze()

        shifts = landmark_shift_deltas(fd, landmarks).round(3)
        np.testing.assert_almost_equal(shifts, [0.25, -0.25, -0.231])

    def test_landmark_shift(self):

        fd = make_multimodal_samples(n_samples=3, random_state=1)
        landmarks = make_multimodal_landmarks(n_samples=3, random_state=1)
        landmarks = landmarks.squeeze()

        original_modes = fd(landmarks.reshape((3, 1, 1)), aligned=False)
        # Test default location
        fd_registered = landmark_shift(fd, landmarks)
        center = (landmarks.max() + landmarks.min()) / 2
        reg_modes = fd_registered(center)

        # Test callable location
        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

        fd_registered = landmark_shift(fd, landmarks, location=np.mean)
        center = np.mean(landmarks)
        reg_modes = fd_registered(center)

        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

        # Test integer location
        fd_registered = landmark_shift(fd, landmarks, location=0)
        center = np.mean(landmarks)
        reg_modes = fd_registered(0)

        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

        # Test array location
        fd_registered = landmark_shift(fd, landmarks, location=[0, 0.1, 0.2])
        reg_modes = fd_registered([[0], [.1], [.2]], aligned=False)

        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

    def test_landmark_registration_warping(self):
        fd = make_multimodal_samples(n_samples=3, n_modes=2, random_state=9)
        landmarks = make_multimodal_landmarks(n_samples=3,
                                              n_modes=2,
                                              random_state=9)
        landmarks = landmarks.squeeze()

        # Default location
        warping = landmark_registration_warping(fd, landmarks)
        center = (landmarks.max(axis=0) + landmarks.min(axis=0)) / 2
        np.testing.assert_almost_equal(warping(center)[..., 0],
                                       landmarks,
                                       decimal=1)

        # Fixed location
        center = [.3, .6]
        warping = landmark_registration_warping(fd, landmarks, location=center)
        np.testing.assert_almost_equal(warping(center)[..., 0],
                                       landmarks,
                                       decimal=3)

    def test_landmark_registration(self):
        fd = make_multimodal_samples(n_samples=3, n_modes=2, random_state=9)
        landmarks = make_multimodal_landmarks(n_samples=3,
                                              n_modes=2,
                                              random_state=9)
        landmarks = landmarks.squeeze()

        original_values = fd(landmarks.reshape(3, 2), aligned=False)

        # Default location
        fd_reg = landmark_registration(fd, landmarks)
        center = (landmarks.max(axis=0) + landmarks.min(axis=0)) / 2
        np.testing.assert_almost_equal(fd_reg(center),
                                       original_values,
                                       decimal=2)

        # Fixed location
        center = [.3, .6]
        fd_reg = landmark_registration(fd, landmarks, location=center)
        np.testing.assert_array_almost_equal(fd_reg(center),
                                             original_values,
                                             decimal=2)
Example #3
0
class TestWarping(unittest.TestCase):
    """Test warpings functions"""
    def setUp(self):
        """Initialization of samples"""

        self.time = np.linspace(-1, 1, 50)
        interpolator = SplineInterpolator(3, monotone=True)
        self.polynomial = FDataGrid([self.time**3, self.time**5],
                                    self.time,
                                    interpolator=interpolator)

    def test_invert_warping(self):

        inverse = invert_warping(self.polynomial)

        # Check if identity
        id = self.polynomial.compose(inverse)

        np.testing.assert_array_almost_equal([self.time, self.time],
                                             id.data_matrix[..., 0],
                                             decimal=3)

    def test_standard_normalize_warping(self):
        """Test normalization to (0, 1)"""

        normalized = normalize_warping(self.polynomial, (0, 1))

        # Test new domain range (0, 1)
        np.testing.assert_array_equal(normalized.domain_range, [(0, 1)])

        np.testing.assert_array_almost_equal(normalized.sample_points[0],
                                             np.linspace(0, 1, 50))

        np.testing.assert_array_almost_equal(normalized(0), [[0.], [0.]])

        np.testing.assert_array_almost_equal(normalized(1), [[1.], [1.]])

    def test_normalize_warpig(self):
        """Test normalization to (a, b)"""
        a = -4
        b = 3
        domain = (a, b)
        normalized = normalize_warping(self.polynomial, domain)

        # Test new domain range (0, 1)
        np.testing.assert_array_equal(normalized.domain_range, [domain])

        np.testing.assert_array_almost_equal(normalized.sample_points[0],
                                             np.linspace(*domain, 50))

        np.testing.assert_array_equal(normalized(a), [[a], [a]])

        np.testing.assert_array_equal(normalized(b), [[b], [b]])

    def test_landmark_shift_deltas(self):

        fd = make_multimodal_samples(n_samples=3, random_state=1)
        landmarks = make_multimodal_landmarks(n_samples=3, random_state=1)
        landmarks = landmarks.squeeze()

        shifts = landmark_shift_deltas(fd, landmarks).round(3)
        np.testing.assert_almost_equal(shifts, [0.25, -0.25, -0.231])

    def test_landmark_shift(self):

        fd = make_multimodal_samples(n_samples=3, random_state=1)
        landmarks = make_multimodal_landmarks(n_samples=3, random_state=1)
        landmarks = landmarks.squeeze()

        original_modes = fd(landmarks.reshape((3, 1, 1)),
                            aligned_evaluation=False)
        # Test default location
        fd_registered = landmark_shift(fd, landmarks)
        center = (landmarks.max() + landmarks.min()) / 2
        reg_modes = fd_registered(center)

        # Test callable location
        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

        fd_registered = landmark_shift(fd, landmarks, location=np.mean)
        center = np.mean(landmarks)
        reg_modes = fd_registered(center)

        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

        # Test integer location
        fd_registered = landmark_shift(fd, landmarks, location=0)
        center = np.mean(landmarks)
        reg_modes = fd_registered(0)

        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

        # Test array location
        fd_registered = landmark_shift(fd, landmarks, location=[0, 0.1, 0.2])
        reg_modes = fd_registered([[0], [.1], [.2]], aligned_evaluation=False)

        np.testing.assert_almost_equal(reg_modes, original_modes, decimal=2)

    def test_landmark_registration_warping(self):
        fd = make_multimodal_samples(n_samples=3, n_modes=2, random_state=9)
        landmarks = make_multimodal_landmarks(n_samples=3,
                                              n_modes=2,
                                              random_state=9)
        landmarks = landmarks.squeeze()

        # Default location
        warping = landmark_registration_warping(fd, landmarks)
        center = (landmarks.max(axis=0) + landmarks.min(axis=0)) / 2
        np.testing.assert_almost_equal(warping(center), landmarks, decimal=1)

        # Fixed location
        center = [.3, .6]
        warping = landmark_registration_warping(fd, landmarks, location=center)
        np.testing.assert_almost_equal(warping(center), landmarks, decimal=3)

    def test_landmark_registration(self):
        fd = make_multimodal_samples(n_samples=3, n_modes=2, random_state=9)
        landmarks = make_multimodal_landmarks(n_samples=3,
                                              n_modes=2,
                                              random_state=9)
        landmarks = landmarks.squeeze()

        original_values = fd(landmarks.reshape(3, 2), aligned_evaluation=False)

        # Default location
        fd_reg = landmark_registration(fd, landmarks)
        center = (landmarks.max(axis=0) + landmarks.min(axis=0)) / 2
        np.testing.assert_almost_equal(fd_reg(center),
                                       original_values,
                                       decimal=2)

        # Fixed location
        center = [.3, .6]
        fd_reg = landmark_registration(fd, landmarks, location=center)
        np.testing.assert_array_almost_equal(fd_reg(center),
                                             original_values,
                                             decimal=2)

    def test_mse_decomposition(self):
        fd = make_multimodal_samples(n_samples=3, random_state=1)
        landmarks = make_multimodal_landmarks(n_samples=3, random_state=1)
        landmarks = landmarks.squeeze()
        warping = landmark_registration_warping(fd, landmarks)
        fd_registered = fd.compose(warping)
        ret = mse_decomposition(fd, fd_registered, warping)

        np.testing.assert_almost_equal(ret.mse_amp, 0.0009866997121476962)
        np.testing.assert_almost_equal(ret.mse_pha, 0.11576861468435257)
        np.testing.assert_almost_equal(ret.rsq, 0.9915489952877273)
        np.testing.assert_almost_equal(ret.cr, 0.9999963424653829)

    def test_shift_registration_deltas(self):

        fd = make_sinusoidal_process(n_samples=2, error_std=0, random_state=1)

        deltas = shift_registration_deltas(fd).round(3)
        np.testing.assert_array_almost_equal(deltas, [-0.022, 0.03])

        fd = fd.to_basis(Fourier())
        deltas = shift_registration_deltas(fd).round(3)
        np.testing.assert_array_almost_equal(deltas, [-0.022, 0.03])

    def test_shift_registration(self):
        """Test wrapper of shift_registration_deltas"""

        fd = make_sinusoidal_process(n_samples=2, error_std=0, random_state=1)

        fd_reg = shift_registration(fd)
        deltas = shift_registration_deltas(fd)
        np.testing.assert_array_almost_equal(fd_reg.data_matrix,
                                             fd.shift(deltas).data_matrix)