def __init__(self, group, inner_product_mat_at_identity=None, left_or_right='left'): if inner_product_mat_at_identity is None: inner_product_mat_at_identity = gs.eye(self.group.dimension) inner_product_mat_at_identity = gs.to_ndarray( inner_product_mat_at_identity, to_ndim=3) mat_shape = inner_product_mat_at_identity.shape assert mat_shape == (1, ) + (group.dimension, ) * 2, mat_shape assert left_or_right in ('left', 'right') eigenvalues = gs.linalg.eigvalsh(inner_product_mat_at_identity) mask_pos_eigval = gs.greater(eigenvalues, 0.) n_pos_eigval = gs.sum(gs.cast(mask_pos_eigval, gs.int32)) mask_neg_eigval = gs.less(eigenvalues, 0.) n_neg_eigval = gs.sum(gs.cast(mask_neg_eigval, gs.int32)) mask_null_eigval = gs.isclose(eigenvalues, 0.) n_null_eigval = gs.sum(gs.cast(mask_null_eigval, gs.int32)) self.group = group if inner_product_mat_at_identity is None: inner_product_mat_at_identity = gs.eye(self.group.dimension) self.inner_product_mat_at_identity = inner_product_mat_at_identity self.left_or_right = left_or_right self.signature = (n_pos_eigval, n_null_eigval, n_neg_eigval)
def __init__(self, group, algebra=None, metric_mat_at_identity=None, left_or_right='left', **kwargs): super(InvariantMetric, self).__init__(dim=group.dim, **kwargs) self.group = group self.lie_algebra = algebra if metric_mat_at_identity is None: metric_mat_at_identity = gs.eye(self.group.dim) geomstats.errors.check_parameter_accepted_values( left_or_right, 'left_or_right', ['left', 'right']) eigenvalues = gs.linalg.eigvalsh(metric_mat_at_identity) mask_pos_eigval = gs.greater(eigenvalues, 0.) n_pos_eigval = gs.sum(gs.cast(mask_pos_eigval, gs.int32)) mask_neg_eigval = gs.less(eigenvalues, 0.) n_neg_eigval = gs.sum(gs.cast(mask_neg_eigval, gs.int32)) mask_null_eigval = gs.isclose(eigenvalues, 0.) n_null_eigval = gs.sum(gs.cast(mask_null_eigval, gs.int32)) self.metric_mat_at_identity = metric_mat_at_identity self.left_or_right = left_or_right self.signature = (n_pos_eigval, n_null_eigval, n_neg_eigval)
def belongs(self, point): """Evaluate if a point belongs to the manifold of beta distributions. The statistical manifold of beta distributions is the upper right quadrant of the euclidean 2-plane. Parameters ---------- point : array-like, shape=[..., 2] Point to be checked. Returns ------- belongs : array-like, shape=[...,] Boolean indicating whether point represents a beta distribution. """ point_dim = point.shape[-1] belongs = point_dim == self.dim belongs = gs.logical_and( belongs, gs.all(gs.greater(point, 0.), axis=-1)) return belongs
def belongs(self, point): """Evaluate if a point belongs to the manifold of Dirichlet distributions. Check that point defines parameters for a Dirichlet distributions, i.e. belongs to the positive quadrant of the Euclidean space. Parameters ---------- point : array-like, shape=[..., dim] Point to be checked. Returns ------- belongs : array-like, shape=[...,] Boolean indicating whether point represents a Dirichlet distribution. """ point_dim = point.shape[-1] belongs = point_dim == self.dim belongs = gs.logical_and( belongs, gs.all(gs.greater(point, 0.), axis=-1)) return belongs
def belongs(self, point, point_type=None): """Evaluate if a point belongs to the manifold of beta distributions. The statistical manifold of beta distributions is the upper right quadrant of the euclidean 2-plane. Parameters ---------- point : array-like, shape=[n_samples, 2] the point of which to check whether it belongs to Beta Returns ------- belongs : array-like, shape=[n_samples, 1] array of booleans indicating whether point belongs the Beta """ point = gs.to_ndarray(point, to_ndim=2) n_points, point_dim = point.shape belongs = point_dim == self.dim belongs = gs.to_ndarray(belongs, to_ndim=1) belongs = gs.tile(belongs, n_points) belongs = belongs * gs.greater(point, 0).all(axis=1) return belongs[0] if n_points == 1 else belongs
def __init__(self, group, inner_product_mat_at_identity=None, left_or_right='left'): self.group = group if inner_product_mat_at_identity is None: inner_product_mat_at_identity = gs.eye(self.group.dim) geomstats.error.check_parameter_accepted_values( left_or_right, 'left_or_right', ['left', 'right']) eigenvalues = gs.linalg.eigvalsh(inner_product_mat_at_identity) mask_pos_eigval = gs.greater(eigenvalues, 0.) n_pos_eigval = gs.sum(gs.cast(mask_pos_eigval, gs.int32)) mask_neg_eigval = gs.less(eigenvalues, 0.) n_neg_eigval = gs.sum(gs.cast(mask_neg_eigval, gs.int32)) mask_null_eigval = gs.isclose(eigenvalues, 0.) n_null_eigval = gs.sum(gs.cast(mask_null_eigval, gs.int32)) self.inner_product_mat_at_identity = inner_product_mat_at_identity self.left_or_right = left_or_right self.signature = (n_pos_eigval, n_null_eigval, n_neg_eigval)