예제 #1
0
 def test_fit_matrix(self):
     expected = 2
     X = self.spd.random_point(n_samples=5)
     tpca = TangentPCA(metric=self.spd_metric, n_components=expected)
     tpca.fit(X)
     result = tpca.n_components_
     self.assertAllClose(result, expected)
예제 #2
0
def test_tangent_pca_error(data):
    X = data
    trans = TangentPCA(n_components=N_COMPONENTS)
    trans.fit(X)
    with pytest.raises(ValueError, match="Shape of input is different"):
        X_diff_size = np.ones((10, X.shape[1] + 1))
        trans.transform(X_diff_size)
예제 #3
0
 def test_tangent_pca_error(self):
     X = self.X
     tpca = TangentPCA(self.metric, n_components=self.n_components)
     tpca.fit(X)
     X_diff_size = gs.ones((self.n_samples, gs.shape(X)[1] + 1))
     with pytest.raises(ValueError):
         tpca.transform(X_diff_size)
예제 #4
0
 def test_fit_to_target_explained_variance(self):
     X = self.spd.random_point(n_samples=5)
     target = 0.90
     tpca = TangentPCA(self.spd_metric, n_components=target)
     tpca.fit(X)
     result = gs.cumsum(tpca.explained_variance_ratio_)[-1] > target
     expected = True
     self.assertAllClose(result, expected)
예제 #5
0
def test_tangent_pca(data):
    X = data
    trans = TangentPCA(n_components=N_COMPONENTS)
    assert trans.demo_param == 'demo'

    trans.fit(X)
    assert trans.n_features_ == X.shape[1]

    X_trans = trans.transform(X)
    assert_allclose(X_trans, np.sqrt(X))

    X_trans = trans.fit_transform(X)
    assert_allclose(X_trans, np.sqrt(X))
예제 #6
0
def main():
    fig = plt.figure(figsize=(15, 5))

    data = SO3_GROUP.random_uniform(n_samples=N_SAMPLES)
    mean = METRIC.mean(data)

    tpca = TangentPCA(metric=METRIC, n_components=N_COMPONENTS)
    tpca = tpca.fit(data, base_point=mean)
    tangent_projected_data = tpca.transform(data)
    print('Coordinates of the Log of the first 5 data points at the mean, '
          'projected on the principal components:')
    print(tangent_projected_data[:5])

    ax_var = fig.add_subplot(121)
    xticks = np.arange(1, N_COMPONENTS + 1, 1)
    ax_var.xaxis.set_ticks(xticks)
    ax_var.set_title('Explained variance')
    ax_var.set_xlabel('Number of Principal Components')
    ax_var.set_ylim((0, 1))
    ax_var.plot(xticks, tpca.explained_variance_ratio_)

    ax = fig.add_subplot(122, projection="3d")
    plt.setp(ax, xlabel="X", ylabel="Y", zlabel="Z")

    ax.set_title('Data in SO3 (black) and Frechet mean (color)')
    visualization.plot(data, ax, space='SO3_GROUP', color='black')
    visualization.plot(mean, ax, space='SO3_GROUP', linewidth=3)
    ax.set_xlim((-2, 2))
    ax.set_ylim((-2, 2))
    ax.set_zlim((-2, 2))
    plt.show()
예제 #7
0
 def test_fit_fit_transform_matrix(self):
     X = self.spd.random_uniform(n_samples=5)
     tpca = TangentPCA(
         metric=self.spd_metric)
     expected = tpca.fit_transform(X)
     result = tpca.fit(X).transform(X)
     self.assertAllClose(result, expected)
예제 #8
0
def main():
    """Perform tangent PCA at the mean."""
    fig = plt.figure(figsize=(15, 5))

    hyperbolic_plane = Hyperbolic(dimension=2)

    data = hyperbolic_plane.random_uniform(n_samples=140)
    mean = hyperbolic_plane.metric.mean(data)

    tpca = TangentPCA(metric=hyperbolic_plane.metric, n_components=2)
    tpca = tpca.fit(data, base_point=mean)
    tangent_projected_data = tpca.transform(data)

    geodesic_0 = hyperbolic_plane.metric.geodesic(
        initial_point=mean, initial_tangent_vec=tpca.components_[0])
    geodesic_1 = hyperbolic_plane.metric.geodesic(
        initial_point=mean, initial_tangent_vec=tpca.components_[1])

    n_steps = 100
    t = np.linspace(-1, 1, n_steps)
    geodesic_points_0 = geodesic_0(t)
    geodesic_points_1 = geodesic_1(t)

    print('Coordinates of the Log of the first 5 data points at the mean, '
          'projected on the principal components:')
    print(tangent_projected_data[:5])

    ax_var = fig.add_subplot(121)
    xticks = np.arange(1, 2 + 1, 1)
    ax_var.xaxis.set_ticks(xticks)
    ax_var.set_title('Explained variance')
    ax_var.set_xlabel('Number of Principal Components')
    ax_var.set_ylim((0, 1))
    ax_var.plot(xticks, tpca.explained_variance_ratio_)

    ax = fig.add_subplot(122)

    visualization.plot(mean,
                       ax,
                       space='H2_poincare_disk',
                       color='darkgreen',
                       s=10)
    visualization.plot(geodesic_points_0,
                       ax,
                       space='H2_poincare_disk',
                       linewidth=2)
    visualization.plot(geodesic_points_1,
                       ax,
                       space='H2_poincare_disk',
                       linewidth=2)
    visualization.plot(data,
                       ax,
                       space='H2_poincare_disk',
                       color='black',
                       alpha=0.7)

    plt.show()
예제 #9
0
def main():
    """Perform tangent PCA at the mean on the sphere."""
    fig = plt.figure(figsize=(15, 5))

    sphere = Hypersphere(dim=2)

    data = sphere.random_von_mises_fisher(kappa=15, n_samples=140)

    mean = FrechetMean(metric=sphere.metric)
    mean.fit(data)

    mean_estimate = mean.estimate_

    tpca = TangentPCA(metric=sphere.metric, n_components=2)
    tpca = tpca.fit(data, base_point=mean_estimate)
    tangent_projected_data = tpca.transform(data)

    geodesic_0 = sphere.metric.geodesic(
        initial_point=mean_estimate, initial_tangent_vec=tpca.components_[0]
    )
    geodesic_1 = sphere.metric.geodesic(
        initial_point=mean_estimate, initial_tangent_vec=tpca.components_[1]
    )

    n_steps = 100
    t = np.linspace(-1, 1, n_steps)
    geodesic_points_0 = geodesic_0(t)
    geodesic_points_1 = geodesic_1(t)

    logging.info(
        "Coordinates of the Log of the first 5 data points at the mean, "
        "projected on the principal components:"
    )
    logging.info("\n{}".format(tangent_projected_data[:5]))

    ax_var = fig.add_subplot(121)
    xticks = np.arange(1, 2 + 1, 1)
    ax_var.xaxis.set_ticks(xticks)
    ax_var.set_title("Explained variance")
    ax_var.set_xlabel("Number of Principal Components")
    ax_var.set_ylim((0, 1))
    ax_var.plot(xticks, tpca.explained_variance_ratio_)

    ax = fig.add_subplot(122, projection="3d")

    visualization.plot(mean_estimate, ax, space="S2", color="darkgreen", s=10)
    visualization.plot(geodesic_points_0, ax, space="S2", linewidth=2)
    visualization.plot(geodesic_points_1, ax, space="S2", linewidth=2)
    visualization.plot(data, ax, space="S2", color="black", alpha=0.7)

    plt.show()
예제 #10
0
def main():
    """Perform tangent PCA at the mean on SO(3)."""
    fig = plt.figure(figsize=(15, 5))

    data = SO3_GROUP.random_uniform(n_samples=N_SAMPLES)

    mean = FrechetMean(metric=METRIC)
    mean.fit(data)

    mean_estimate = mean.estimate_

    tpca = TangentPCA(metric=METRIC, n_components=N_COMPONENTS)
    tpca = tpca.fit(data, base_point=mean_estimate)
    tangent_projected_data = tpca.transform(data)
    logging.info(
        'Coordinates of the Log of the first 5 data points at the mean, '
        'projected on the principal components:')
    logging.info('\n{}'.format(tangent_projected_data[:5]))

    ax_var = fig.add_subplot(121)
    xticks = np.arange(1, N_COMPONENTS + 1, 1)
    ax_var.xaxis.set_ticks(xticks)
    ax_var.set_title('Explained variance')
    ax_var.set_xlabel('Number of Principal Components')
    ax_var.set_ylim((0, 1))
    ax_var.plot(xticks, tpca.explained_variance_ratio_)

    ax = fig.add_subplot(122, projection='3d')
    plt.setp(ax, xlabel='X', ylabel='Y', zlabel='Z')

    ax.set_title('Data in SO3 (black) and Frechet mean (color)')
    visualization.plot(data, ax, space='SO3_GROUP', color='black')
    visualization.plot(mean_estimate, ax, space='SO3_GROUP', linewidth=3)
    ax.set_xlim((-2, 2))
    ax.set_ylim((-2, 2))
    ax.set_zlim((-2, 2))
    plt.show()
예제 #11
0
    def test_tangent_pca(self):
        X = self.X
        trans = TangentPCA(self.metric, n_components=gs.shape(X)[1])

        trans.fit(X)
        self.assertEquals(trans.n_features_, gs.shape(X)[1])
예제 #12
0
 def test_tangent_pca_error(self):
     X = self.X
     trans = TangentPCA(self.metric, n_components=self.n_components)
     trans.fit(X)
     X_diff_size = gs.ones((self.n_samples, gs.shape(X)[1] + 1))
     self.assertRaises(ValueError, trans.transform, X_diff_size)
예제 #13
0
 def test_fit_mle(self):
     X = self.X
     tpca = TangentPCA(self.metric, n_components='mle')
     tpca.fit(X)
     self.assertEqual(tpca.n_features_, gs.shape(X)[1])