/*******************************************************************************
* Copyright (c) 2010 Haifeng Li
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package smile.stat.distribution;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Haifeng Li
*/
public class MultivariateGaussianDistributionTest {
double[] mu = {1.0, 0.0, -1.0};
double[][] sigma = {
{0.9000, 0.4000, 0.7000},
{0.4000, 0.5000, 0.3000},
{0.7000, 0.3000, 0.8000}
};
double[][] x = {
{1.2793, -0.1029, -1.5852},
{-0.2676, -0.1717, -1.8695},
{1.6777, 0.7642, -1.0226},
{2.5402, 1.0887, 0.8989},
{0.3437, 0.4407, -1.9424},
{1.8140, 0.7413, -0.1129},
{2.1897, 1.2047, 0.0128},
{-0.5119, -1.3545, -2.6181},
{-0.3670, -0.6188, -3.1594},
{1.5418, 0.1519, -0.6054}
};
double[] pdf = {
0.0570, 0.0729, 0.0742, 0.0178, 0.0578,
0.1123, 0.0511, 0.0208, 0.0078, 0.1955
};
double[] cdf = {
0.1752, 0.0600, 0.4545, 0.9005, 0.1143,
0.6974, 0.8178, 0.0050, 0.0051, 0.4419
};
public MultivariateGaussianDistributionTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of constructor, of class MultivariateGaussianDistribution.
*/
@Test
public void testMultivariateGaussianDistribution() {
System.out.println("MultivariateGaussianDistribution");
MultivariateGaussianDistribution instance = new MultivariateGaussianDistribution(mu, sigma[0]);
double[][] data = new double[1000][];
for (int i = 0; i < data.length; i++) {
data[i] = instance.rand();
}
MultivariateGaussianDistribution est = new MultivariateGaussianDistribution(data, true);
for (int i = 0; i < mu.length; i++) {
assertEquals(mu[i], est.mean()[i], 1.5E-1);
}
for (int i = 0; i < mu.length; i++) {
assertEquals(sigma[0][i], est.cov()[i][i], 1.5E-1);
for (int j = 0; j < mu.length; j++) {
if (i != j) {
assertEquals(0, est.cov()[i][j], 1E-10);
}
}
}
instance = new MultivariateGaussianDistribution(mu, sigma);
data = new double[1000][];
for (int i = 0; i < data.length; i++) {
data[i] = instance.rand();
}
est = new MultivariateGaussianDistribution(data);
for (int i = 0; i < mu.length; i++) {
assertEquals(mu[i], est.mean()[i], 1E-1);
}
for (int i = 0; i < mu.length; i++) {
for (int j = 0; j < mu.length; j++) {
assertEquals(sigma[i][j], est.cov()[i][j], 1E-1);
}
}
est = new MultivariateGaussianDistribution(data, true);
for (int i = 0; i < mu.length; i++) {
assertEquals(mu[i], est.mean()[i], 1E-1);
}
for (int i = 0; i < mu.length; i++) {
for (int j = 0; j < mu.length; j++) {
if (i == j) {
assertEquals(sigma[i][j], est.cov()[i][j], 1E-1);
} else {
assertEquals(0.0, est.cov()[i][j], 1E-10);
}
}
}
}
/**
* Test of isDiagonal method, of class MultivariateGaussian.
*/
@Test
public void testIsDiagonal() {
System.out.println("isDiagonal");
MultivariateGaussianDistribution instance = new MultivariateGaussianDistribution(mu, 1.0);
assertEquals(true, instance.isDiagonal());
instance = new MultivariateGaussianDistribution(mu, sigma[0]);
assertEquals(true, instance.isDiagonal());
instance = new MultivariateGaussianDistribution(mu, sigma);
assertEquals(false, instance.isDiagonal());
}
/**
* Test of npara method, of class MultivariateGaussian.
*/
@Test
public void testNpara() {
System.out.println("npara");
MultivariateGaussianDistribution instance = new MultivariateGaussianDistribution(mu, 1.0);
assertEquals(4, instance.npara());
instance = new MultivariateGaussianDistribution(mu, sigma[0]);
assertEquals(6, instance.npara());
instance = new MultivariateGaussianDistribution(mu, sigma);
assertEquals(9, instance.npara());
}
/**
* Test of entropy method, of class MultivariateGaussian.
*/
@Test
public void testEntropy() {
System.out.println("entropy");
MultivariateGaussianDistribution instance = new MultivariateGaussianDistribution(mu, sigma);
assertEquals(2.954971, instance.entropy(), 1E-6);
}
/**
* Test of pdf method, of class MultivariateGaussian.
*/
@Test
public void testPdf() {
System.out.println("pdf");
MultivariateGaussianDistribution instance = new MultivariateGaussianDistribution(mu, sigma);
for (int i = 0; i < x.length; i++) {
assertEquals(pdf[i], instance.p(x[i]), 1E-4);
}
}
/**
* Test of cdf method, of class MultivariateGaussian.
*/
@Test
public void testCdf() {
System.out.println("cdf");
MultivariateGaussianDistribution instance = new MultivariateGaussianDistribution(mu, sigma);
for (int i = 0; i < x.length; i++) {
assertEquals(cdf[i], instance.cdf(x[i]), 1E-2);
}
}
}