def test_angle_to_extrinsic(self): space = Hypersphere(1) point = gs.pi / 4 result = space.angle_to_extrinsic(point) expected = gs.array([1., 1.]) / gs.sqrt(2.) self.assertAllClose(result, expected) point = gs.array([1. / 3, 0.]) * gs.pi result = space.angle_to_extrinsic(point) expected = gs.array([[1. / 2, gs.sqrt(3.) / 2], [1., 0.]]) self.assertAllClose(result, expected)
def test_extrinsic_to_angle_inverse(self): space = Hypersphere(1) point = space.random_uniform() angle = space.extrinsic_to_angle(point) result = space.angle_to_extrinsic(angle) self.assertAllClose(result, point) space = Hypersphere(1, default_coords_type='intrinsic') angle = space.random_uniform() extrinsic = space.angle_to_extrinsic(angle) result = space.extrinsic_to_angle(extrinsic) self.assertAllClose(result, angle)
def fit(self, X, y=None, weights=None): """Compute the empirical Frechet mean. Parameters ---------- X : {array-like, sparse matrix}, shape=[..., {dim, [n, n]}] Training input samples. y : array-like, shape=[...,] or [..., n_outputs] Target values (class labels in classification, real numbers in regression). Ignored. weights : array-like, shape=[...,] Weights associated to the points. Optional, default: None. Returns ------- self : object Returns self. """ metric_str = self.metric.__str__() is_linear_metric = ( "EuclideanMetric" in metric_str or "MatricesMetric" in metric_str or "MinkowskiMetric" in metric_str ) if "HypersphereMetric" in metric_str and self.metric.dim == 1: mean = Hypersphere.angle_to_extrinsic(_circle_mean(X)) error.check_parameter_accepted_values( self.method, "method", ["default", "adaptive", "batch"] ) if is_linear_metric: mean = linear_mean(points=X, weights=weights, point_type=self.point_type) elif self.method == "default": mean = _default_gradient_descent( points=X, weights=weights, metric=self.metric, max_iter=self.max_iter, initial_step_size=self.lr, point_type=self.point_type, epsilon=self.epsilon, verbose=self.verbose, ) elif self.method == "adaptive": mean = _adaptive_gradient_descent( points=X, weights=weights, metric=self.metric, max_iter=self.max_iter, point_type=self.point_type, epsilon=self.epsilon, verbose=self.verbose, initial_tau=self.lr, ) elif self.method == "batch": mean = _batch_gradient_descent( points=X, weights=weights, metric=self.metric, lr=self.lr, epsilon=self.epsilon, max_iter=self.max_iter, point_type=self.point_type, verbose=self.verbose, ) self.estimate_ = mean return self