Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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