def test_estimate_transform_spd(self): point = spd.SPDMatrices(3).random_uniform() points = gs.stack([point, point]) transformer = ToTangentSpace(geometry=spd.SPDMetricAffine(3)) transformer.fit(X=points) result = transformer.transform(points) expected = gs.zeros((2, 6)) self.assertAllClose(expected, result, atol=1e-5)
def __init__(self, dim, metric_type="bw"): super(SPDManifold, self).__init__(dim) if metric_type == "bw": self.metric = spd.SPDMetricBuresWasserstein(dim) elif metric_type == "euclid": self.metric = spd.SPDMetricEuclidean(dim) elif metric_type == "logeuclid": self.metric = spd.SPDMetricLogEuclidean(dim) else: self.metric = spd.SPDMetricAffine(dim)
def test_inverse_transform_spd(self): point = spd.SPDMatrices(3).random_uniform(10) transformer = ToTangentSpace(geometry=spd.SPDMetricLogEuclidean(3)) X = transformer.fit_transform(X=point) result = transformer.inverse_transform(X) expected = point self.assertAllClose(expected, result, atol=1e-4) transformer = ToTangentSpace(geometry=spd.SPDMetricAffine(3)) X = transformer.fit_transform(X=point) result = transformer.inverse_transform(X) expected = point self.assertAllClose(expected, result, atol=1e-4)
def test_spd_kmeans_fit(self): gs.random.seed(0) dim = 3 n_points = 2 space = spd_matrices.SPDMatrices(dim) data = space.random_point(n_samples=n_points) metric = spd_matrices.SPDMetricAffine(dim) kmeans = RiemannianKMeans(metric, n_clusters=1, lr=1.0) kmeans.fit(data) result = kmeans.centroids mean = FrechetMean(metric=metric, point_type="matrix", max_iter=100) mean.fit(data) expected = mean.estimate_ self.assertAllClose(result, expected)