Example usage for org.apache.commons.math3.distribution.fitting MultivariateNormalMixtureExpectationMaximization fit

List of usage examples for org.apache.commons.math3.distribution.fitting MultivariateNormalMixtureExpectationMaximization fit

Introduction

In this page you can find the example usage for org.apache.commons.math3.distribution.fitting MultivariateNormalMixtureExpectationMaximization fit.

Prototype

public void fit(MixtureMultivariateNormalDistribution initialMixture)
        throws SingularMatrixException, NotStrictlyPositiveException 

Source Link

Document

Fit a mixture model to the data supplied to the constructor.

Usage

From source file:sly.speakrecognizer.test.math.MultivariateNormalMixtureExpectationMaximizationFitterTest.java

@Test(expected = DimensionMismatchException.class)
public void testIncompatibleIntialMixture() {
    // Data has 3 columns
    double[][] data = new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
    double[] weights = new double[] { 0.5, 0.5 };

    // These distributions are compatible with 2-column data, not 3-column
    // data/*from w w w.ja  va 2  s  . c  om*/
    MultivariateNormalDistribution[] mvns = new MultivariateNormalDistribution[2];

    mvns[0] = new MultivariateNormalDistribution(new double[] { -0.0021722935000328823, 3.5432892936887908 },
            new double[][] { { 4.537422569229048, 3.5266152281729304 },
                    { 3.5266152281729304, 6.175448814169779 } });
    mvns[1] = new MultivariateNormalDistribution(new double[] { 5.090902706507635, 8.68540656355283 },
            new double[][] { { 2.886778573963039, 1.5257474543463154 },
                    { 1.5257474543463154, 3.3794567673616918 } });

    // Create components and mixture
    List<Pair<Double, MultivariateNormalDistribution>> components = new ArrayList<Pair<Double, MultivariateNormalDistribution>>();
    components.add(new Pair<Double, MultivariateNormalDistribution>(weights[0], mvns[0]));
    components.add(new Pair<Double, MultivariateNormalDistribution>(weights[1], mvns[1]));

    MixtureMultivariateNormalDistribution badInitialMix = new MixtureMultivariateNormalDistribution(components);

    MultivariateNormalMixtureExpectationMaximization fitter = new MultivariateNormalMixtureExpectationMaximization(
            data);

    fitter.fit(badInitialMix);
}

From source file:sly.speakrecognizer.test.math.MultivariateNormalMixtureExpectationMaximizationFitterTest.java

@Test
public void testFit() {
    // Test that the loglikelihood, weights, and models are determined and
    // fitted correctly
    double[][] data = getTestSamples();
    double correctLogLikelihood = -4.292431006791994;
    double[] correctWeights = new double[] { 0.2962324189652912, 0.7037675810347089 };
    MultivariateNormalDistribution[] correctMVNs = new MultivariateNormalDistribution[2];
    correctMVNs[0] = new MultivariateNormalDistribution(
            new double[] { -1.4213112715121132, 1.6924690505757753 }, new double[][] {
                    { 1.739356907285747, -0.5867644251487614 }, { -0.5867644251487614, 1.0232932029324642 } });

    correctMVNs[1] = new MultivariateNormalDistribution(new double[] { 4.213612224374709, 7.975621325853645 },
            new double[][] { { 4.245384898007161, 2.5797798966382155 },
                    { 2.5797798966382155, 3.9200272522448367 } });
    //=========================================
    MultivariateNormalMixtureExpectationMaximization fitter = new MultivariateNormalMixtureExpectationMaximization(
            data);/*from w w  w.  j  av  a 2s .com*/
    MixtureMultivariateNormalDistribution initialMix = MultivariateNormalMixtureExpectationMaximization
            .estimate(data, 2);
    fitter.fit(initialMix);
    MixtureMultivariateNormalDistribution fittedMix = fitter.getFittedModel();
    printMMND(fittedMix);
    List<Pair<Double, MultivariateNormalDistribution>> components = fittedMix.getComponents();

    Assert.assertEquals(correctLogLikelihood, fitter.getLogLikelihood(), Math.ulp(1d));

    int i = 0;
    for (Pair<Double, MultivariateNormalDistribution> component : components) {
        double weight = component.getFirst();
        MultivariateNormalDistribution mvn = component.getSecond();
        Assert.assertEquals(correctWeights[i], weight, Math.ulp(1d));
        assertMultivariateNormalDistribution(correctMVNs[i], mvn, 0);
        i++;
    }
}

From source file:sly.speakrecognizer.test.math.MultivariateNormalMixtureExpectationMaximizationFitterTest.java

@Test
public void testFitForDifferentSizesData() {
    System.out.println("TEST DLA ROZNYCH ROZMAROW DANYCH");
    double[][][] covariances = { new double[][] { new double[] { 1.74, -0.59 }, new double[] { -0.59, 1.02 }, },
            new double[][] { new double[] { 4.24, 2.58 }, new double[] { 2.58, 3.92 }, }, };
    double[][] means = { new double[] { -1.42, 1.69 }, new double[] { 4.21, 7.98 }, };

    double[] weights = new double[] { 0.296, 0.704 };
    MixtureMultivariateNormalDistribution mmnd = new MixtureMultivariateNormalDistribution(weights, means,
            covariances);/*from ww w .  ja  va 2s.  c o m*/

    int[] lengths = new int[] { 10, 50, 250, 1500, 10000, 100000 };
    double[] errors = new double[lengths.length];
    int counter = 0;
    for (int length : lengths) {
        System.out.println("Dla dugoci danych: " + length);
        double[][] data = getTestSamples(length, mmnd);
        MultivariateNormalMixtureExpectationMaximization fitter = new MultivariateNormalMixtureExpectationMaximization(
                data);
        MixtureMultivariateNormalDistribution initialMix = MultivariateNormalMixtureExpectationMaximization
                .estimate(data, 2);
        fitter.fit(initialMix);
        MixtureMultivariateNormalDistribution fittedMix = fitter.getFittedModel();
        printMMND(fittedMix);
        errors[counter++] = printErrorsMMND(mmnd, fittedMix);
    }
    System.out.println("Podsumowanie");
    for (int x = 0; x < lengths.length; x++) {
        System.out.println("Dla length = " + lengths[x] + " bd wynosi = " + errors[x]);
    }

}