Beispiel #1
0
    def test_fit(self):
        """Test the fit method."""
        X_train_a = gs.array([[[EULER**2, 0], [0, 1]], [[1, 0], [0, 1]]])
        X_train_b = gs.array([[[EULER**8, 0], [0, 1]], [[1, 0], [0, 1]]])
        X_train = gs.concatenate([X_train_a, X_train_b])
        y_train = gs.array([0, 0, 1, 1])

        for metric in METRICS:
            MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
                metric(n=2), n_classes=2, point_type="matrix")
            MDMEstimator.fit(X_train, y_train)
            bary_a_fit = MDMEstimator.mean_estimates_[0]
            bary_b_fit = MDMEstimator.mean_estimates_[1]

            if metric in [SPDMetricAffine, SPDMetricLogEuclidean]:
                bary_a_expected = gs.array([[EULER, 0], [0, 1]])
                bary_b_expected = gs.array([[EULER**4, 0], [0, 1]])
            elif metric in [SPDMetricEuclidean]:
                bary_a_expected = gs.array([[0.5 * EULER**2 + 0.5, 0], [0, 1]])
                bary_b_expected = gs.array([[0.5 * EULER**8 + 0.5, 0], [0, 1]])
            else:
                raise ValueError("Invalid metric: {}".format(metric))

            self.assertAllClose(bary_a_fit, bary_a_expected)
            self.assertAllClose(bary_b_fit, bary_b_expected)
def main():
    """Execute illustration of MDM supervised classifier."""
    n_samples = 100
    n_features = 2
    n_classes = 3

    # generate toy dataset of 2D SPD matrices
    dataset_generator = geomstats.datasets.sample_sdp_2d.DatasetSPD2D(
        n_samples, n_features, n_classes)
    data, labels = dataset_generator.generate_sample_dataset()

    # plot dataset as ellipses
    ellipsis = visualization.Ellipsis2D()
    for i in range(n_samples):
        x = data[i]
        y = geomstats.datasets.sample_sdp_2d.get_label_at_index(i, labels)
        ellipsis.draw(x, color=ellipsis.colors[y], alpha=.1)

    # define and fit MDM classifier to data
    metric = SPDMetricAffine(n=n_features)
    MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
        metric, n_classes, point_type='matrix')
    MDMEstimator.fit(data, labels)

    # plot Frechet means computed in the MDM
    for i in range(n_classes):
        ellipsis.draw(MDMEstimator.mean_estimates_[i],
                      color=ellipsis.colors_alt[i],
                      linewidth=5,
                      label='Barycenter of class ' + str(i))

    # generate random test samples, and predict with MDM classifier
    data_test = SPDMatrices(n=n_features).random_uniform(n_samples=3)
    predictions = MDMEstimator.predict(data_test)

    for i in range(data_test.shape[0]):
        c = list(predictions[i] == 1).index(True)
        x_from, y_from = ellipsis.draw(data_test[i],
                                       color=ellipsis.colors[c],
                                       linewidth=5)
        _, _, x_to, y_to = ellipsis.compute_coordinates(
            MDMEstimator.mean_estimates_[c])
        arrow = visualization.DataArrow(ellipsis.fig)
        arrow.draw(x_from, y_from, x_to, y_to)

    ellipsis.fig.axes[0].set_title(
        'Example plot of the MDM classifier in dimension 2\n'
        '3-class fit and 3 test sample prediction\n'
        '(black arrows denote assignement)')
    ellipsis.plot()
Beispiel #3
0
    def test_predict(self):
        """Test the predict method."""
        X_train_a = gs.array([[EULER, 0], [0, 1]])[None, ...]
        X_train_b = gs.array([[EULER**4, 0], [0, 1]])[None, ...]
        X_train = gs.concatenate([X_train_a, X_train_b])
        y_train = gs.array([42, 17])

        X_test = gs.array([[EULER**2, 0], [0, 1]])[None, ...]
        y_expected = gs.array([42])

        for metric in METRICS:
            MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
                metric(n=2), n_classes=2, point_type="matrix")
            MDMEstimator.fit(X_train, y_train)
            y_test = MDMEstimator.predict(X_test)

            self.assertAllClose(y_test, y_expected)
Beispiel #4
0
    def test_predict(self):
        """Test the predict method."""
        n_clusters = 2
        bary_a = gs.array([[EULER, 0], [0, 1]])
        bary_b = gs.array([[EULER**4, 0], [0, 1]])

        MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
            SPDMetricAffine(n=2), n_clusters, point_type='matrix')
        MDMEstimator.mean_estimates_ = gs.concatenate(
            [bary_a[None, ...], bary_b[None, ...]])

        X = gs.array([[EULER**3, 0], [0, 1]])[None, ...]

        y_expected = gs.array([[0, 1]])

        y_result = MDMEstimator.predict(X)

        self.assertAllClose(y_result, y_expected)
Beispiel #5
0
    def test_score(self):
        """Test the score method."""
        X_train_a = gs.array([[EULER, 0], [0, 1]])[None, ...]
        X_train_b = gs.array([[EULER**4, 0], [0, 1]])[None, ...]
        X_train = gs.concatenate([X_train_a, X_train_b])
        y_train = gs.array([-1, 1])

        X_test = gs.array([[[EULER**3, 0], [0, 1]], [[EULER**2, 0], [0, 1]]])

        for metric in METRICS:
            MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
                metric(n=2), n_classes=2, point_type="matrix")
            MDMEstimator.fit(X_train, y_train)

            if metric in [SPDMetricAffine, SPDMetricLogEuclidean]:
                y_expected = gs.array([1, -1])
            elif metric in [SPDMetricEuclidean]:
                y_expected = gs.array([-1, -1])
            else:
                raise ValueError("Invalid metric: {}".format(metric))

            accuracy = MDMEstimator.score(X_test, y_expected)
            self.assertAllClose(accuracy, 1.0)
Beispiel #6
0
    def test_predict_proba(self):
        """Test the predict_proba method."""
        X_train_a = gs.array([[1.0, 0], [0, 1]])[None, ...]
        X_train_b = gs.array([[EULER**10, 0], [0, 1]])[None, ...]
        X_train = gs.concatenate([X_train_a, X_train_b])
        y_train = gs.array([1, 2])

        X_test = gs.array([[[1.0, 0], [0, 1]], [[EULER**5, 0], [0, 1]]])

        for metric in METRICS:
            MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
                metric(n=2), n_classes=2, point_type="matrix")
            MDMEstimator.fit(X_train, y_train)
            proba_test = MDMEstimator.predict_proba(X_test)

            if metric in [SPDMetricAffine, SPDMetricLogEuclidean]:
                proba_expected = gs.array([[1.0, 0.0], [0.5, 0.5]])
            elif metric in [SPDMetricEuclidean]:
                proba_expected = gs.array([[1.0, 0.0], [1.0, 0.0]])
            else:
                raise ValueError("Invalid metric: {}".format(metric))

            self.assertAllClose(proba_test, proba_expected)
Beispiel #7
0
    def test_fit(self):
        """Test the fit method."""
        n_clusters = 2
        MDMEstimator = RiemannianMinimumDistanceToMeanClassifier(
            SPDMetricAffine(n=2), n_clusters, point_type='matrix')

        points_a = gs.array([[[EULER**2, 0], [0, 1]], [[1, 0], [0, 1]]])
        labels_a = gs.array([[1, 0], [1, 0]])
        bary_a_expected = gs.array([[EULER, 0], [0, 1]])

        points_b = gs.array([[[EULER**8, 0], [0, 1]], [[1, 0], [0, 1]]])
        labels_b = gs.array([[0, 1], [0, 1]])
        bary_b_expected = gs.array([[EULER**4, 0], [0, 1]])

        train_data = gs.concatenate([points_a, points_b])
        train_labels = gs.concatenate([labels_a, labels_b])

        MDMEstimator.fit(train_data, train_labels)

        bary_a_result = MDMEstimator.mean_estimates_[0]
        bary_b_result = MDMEstimator.mean_estimates_[1]

        self.assertAllClose(bary_a_result, bary_a_expected)
        self.assertAllClose(bary_b_result, bary_b_expected)