def test_fit_transform_vector(self): expected = 2 tpca = TangentPCA( metric=self.metric, n_components=expected) tangent_projected_data = tpca.fit_transform(self.X) result = tangent_projected_data.shape[-1] self.assertAllClose(result, expected)
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()
def test_fit_transform_matrix(self): expected = 2 X = self.spd.random_point(n_samples=5) tpca = TangentPCA(metric=self.spd_metric, n_components=expected) tangent_projected_data = tpca.fit_transform(X) result = tangent_projected_data.shape[-1] self.assertAllClose(result, expected)
def test_fit_inverse_transform_matrix(self): X = self.spd.random_uniform(n_samples=5) tpca = TangentPCA(metric=self.spd_metric, point_type='matrix') tangent_projected_data = tpca.fit_transform(X) result = tpca.inverse_transform(tangent_projected_data) expected = X self.assertAllClose(result, expected)
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)
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)
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)
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()
def test_fit_matrix_se(self): se_mat = SpecialEuclidean(n=3, default_point_type='matrix') X = se_mat.random_uniform(self.n_samples) estimator = ExponentialBarycenter(se_mat) estimator.fit(X) mean = estimator.estimate_ tpca = TangentPCA(metric=se_mat, point_type='matrix') tangent_projected_data = tpca.fit_transform(X, base_point=mean) result = tpca.inverse_transform(tangent_projected_data) expected = X self.assertAllClose(result, expected)
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()
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)
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)
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()
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))
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])
def test_fit_inverse_transform_vector(self): tpca = TangentPCA(metric=self.metric, point_type='vector') tangent_projected_data = tpca.fit_transform(self.X) result = tpca.inverse_transform(tangent_projected_data) expected = self.X self.assertAllClose(result, expected)
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)
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])