Ejemplo n.º 1
0
    def _m_step(self, observation, embedding, quadratic_form, affiliation,
                saliency, hermitize, covariance_norm, eigenvalue_floor,
                covariance_type, fixed_covariance, weight_constant_axis,
                spatial_weight, spectral_weight):
        F, T, D = observation.shape
        _, _, E = embedding.shape
        _, K, _ = affiliation.shape

        masked_affiliation = affiliation * saliency[..., None, :]

        if -2 in weight_constant_axis:
            weight = 1 / K
        else:
            weight = np.sum(masked_affiliation,
                            axis=weight_constant_axis,
                            keepdims=True)
            weight /= np.sum(weight, axis=-2, keepdims=True)
            weight = np.squeeze(weight, axis=weight_constant_axis)

        embedding_ = np.reshape(embedding, (1, F * T, E))
        masked_affiliation_ = np.reshape(
            np.transpose(masked_affiliation, (1, 0, 2)),
            (K, F * T))  # 'fkt->k,ft'
        gaussian = GaussianTrainer()._fit(
            y=embedding_,
            saliency=masked_affiliation_,
            covariance_type=covariance_type,
        )

        if fixed_covariance is not None:
            assert fixed_covariance.shape == gaussian.covariance.shape, (
                f'{fixed_covariance.shape} != {gaussian.covariance.shape}')
            gaussian = gaussian.__class__(mean=gaussian.mean,
                                          covariance=fixed_covariance)

        cacg = ComplexAngularCentralGaussianTrainer()._fit(
            y=np.swapaxes(observation[..., None, :, :], -1, -2),
            saliency=masked_affiliation,
            quadratic_form=quadratic_form,
            hermitize=hermitize,
            covariance_norm=covariance_norm,
            eigenvalue_floor=eigenvalue_floor,
        )
        return GCACGMM(weight=weight,
                       gaussian=gaussian,
                       cacg=cacg,
                       weight_constant_axis=weight_constant_axis,
                       spatial_weight=spatial_weight,
                       spectral_weight=spectral_weight)
Ejemplo n.º 2
0
 def test_gaussian(self):
     samples = 10000
     mean = np.ones((3, ))
     covariance = 2 * np.eye(3)
     x = np.random.multivariate_normal(mean, covariance, size=(samples, ))
     model = GaussianTrainer().fit(x)
     assert_allclose(model.mean, mean, atol=0.1)
     assert_allclose(model.covariance, covariance, atol=0.1)
Ejemplo n.º 3
0
    def _m_step(self, x, affiliation, saliency, covariance_type):
        masked_affiliation = affiliation * saliency[..., None, :]
        weight = np.einsum("...kn->...k", masked_affiliation)
        weight /= np.einsum("...n->...", saliency)[..., None]

        gaussian = GaussianTrainer()._fit(y=x,
                                          saliency=masked_affiliation,
                                          covariance_type=covariance_type)
        return GMM(weight=weight, gaussian=gaussian)
Ejemplo n.º 4
0
 def test_spherical_gaussian(self):
     samples = 10000
     mean = np.ones((3, ))
     covariance = 2 * np.eye(3)
     x = np.random.multivariate_normal(mean, covariance, size=(samples, ))
     model = GaussianTrainer().fit(x, covariance_type="spherical")
     assert_allclose(model.mean, mean, atol=0.1)
     assert_allclose(model.covariance,
                     np.mean(np.diag(covariance)),
                     atol=0.1)
Ejemplo n.º 5
0
    def _m_step(
        self,
        x,
        affiliation,
        saliency,
        covariance_type,
        fixed_covariance,
    ):
        masked_affiliation = affiliation * saliency[..., None, :]
        weight = np.einsum("...kn->...k", masked_affiliation)
        weight /= np.einsum("...n->...", saliency)[..., None]

        gaussian = GaussianTrainer()._fit(y=x[..., None, :, :],
                                          saliency=masked_affiliation,
                                          covariance_type=covariance_type)

        if fixed_covariance is not None:
            assert fixed_covariance.shape == gaussian.covariance.shape, (
                f'{fixed_covariance.shape} != {gaussian.covariance.shape}')
            gaussian = gaussian.__class__(mean=gaussian.mean,
                                          covariance=fixed_covariance)

        return GMM(weight=weight, gaussian=gaussian)
Ejemplo n.º 6
0
    def _m_step(self, observation, embedding, quadratic_form, affiliation,
                saliency, hermitize, trace_norm, eigenvalue_floor,
                covariance_type, fixed_covariance, weight_constant_axis,
                spatial_weight, spectral_weight):
        F, T, D = observation.shape
        _, _, E = embedding.shape
        _, K, _ = affiliation.shape

        assert K == 4, f'This fancy sharing is just tested for K == 4 != {K}.'

        masked_affiliation = affiliation * saliency[..., None, :]

        if -2 in weight_constant_axis:
            weight = 1 / K
        else:
            weight = np.sum(masked_affiliation,
                            axis=weight_constant_axis,
                            keepdims=True)
            weight /= np.sum(weight, axis=-2, keepdims=True)
            weight = np.squeeze(weight, axis=weight_constant_axis)

        embedding_ = np.reshape(embedding, (1, F * T, E))

        masked_affiliation_for_gaussian = np.stack(
            (masked_affiliation[:, 0, :] + masked_affiliation[:, 1, :],
             masked_affiliation[:, 2, :] + masked_affiliation[:, 3, :]),
            axis=1)
        masked_affiliation_for_gaussian = np.reshape(
            np.transpose(masked_affiliation_for_gaussian, (1, 0, 2)),
            (2, F * T))  # 'fkt->k,ft'
        gaussian = GaussianTrainer()._fit(
            y=embedding_,
            saliency=masked_affiliation_for_gaussian,
            covariance_type=covariance_type,
        )

        if fixed_covariance is not None:
            assert fixed_covariance.shape == gaussian.covariance.shape, (
                f'{fixed_covariance.shape} != {gaussian.covariance.shape}')
            gaussian = gaussian.__class__(mean=gaussian.mean,
                                          covariance=fixed_covariance)

        # There are 4 classes in quadratic_form. Entry 1 and 2 are equal.
        assert np.mean(
            np.abs(quadratic_form[:, 1, :] - quadratic_form[:, 2, :])) < 1e-4
        quadratic_form = quadratic_form[:, [0, 1, 3], :]

        masked_affiliation_for_cacg = np.stack(
            (masked_affiliation[:, 0, :], masked_affiliation[:, 1, :] +
             masked_affiliation[:, 2, :], masked_affiliation[:, 3, :]),
            axis=1)
        cacg = ComplexAngularCentralGaussianTrainer()._fit(
            y=observation[..., None, :, :],
            saliency=masked_affiliation_for_cacg,
            quadratic_form=quadratic_form,
            hermitize=hermitize,
            trace_norm=trace_norm,
            eigenvalue_floor=eigenvalue_floor,
        )

        # Expand again
        gaussian = gaussian.__class__(mean=np.stack(
            (gaussian.mean[0, :], gaussian.mean[0, :], gaussian.mean[1, :],
             gaussian.mean[1, :])),
                                      covariance=np.stack((
                                          gaussian.covariance[0],
                                          gaussian.covariance[0],
                                          gaussian.covariance[1],
                                          gaussian.covariance[1],
                                      )))
        # print('gaussian.mean.shape', gaussian.mean.shape)
        # print('gaussian.covariance.shape', gaussian.covariance.shape)

        # Expand again
        cacg = ComplexAngularCentralGaussian.from_covariance(
            covariance=np.stack((cacg.covariance[:, 0, :, :],
                                 cacg.covariance[:, 1, :, :],
                                 cacg.covariance[:, 1, :, :],
                                 cacg.covariance[:, 2, :, :]),
                                axis=1))
        # print('cacg.covariance.shape', cacg.covariance.shape)

        return GCACGMM(weight=weight,
                       gaussian=gaussian,
                       cacg=cacg,
                       weight_constant_axis=weight_constant_axis,
                       spatial_weight=spatial_weight,
                       spectral_weight=spectral_weight)