/*******************************************************************************
* 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.demo.stat.distribution;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import smile.math.Math;
import smile.plot.Histogram;
import smile.plot.PlotCanvas;
import smile.plot.Surface;
import smile.stat.distribution.MultivariateGaussianDistribution;
import smile.stat.distribution.MultivariateGaussianMixture;
/**
*
* @author Haifeng Li
*/
@SuppressWarnings("serial")
public class MultivariateGaussianMixtureDemo extends JPanel {
public MultivariateGaussianMixtureDemo() {
super(new GridLayout(1,1));
double[] mu1 = {1.0, 1.0};
double[][] sigma1 = {{1.0, 0.0}, {0.0, 1.0}};
double[] mu2 = {-2.0, -2.0};
double[][] sigma2 = {{1.0, 0.3}, {0.3, 1.0}};
double[] mu3 = {4.0, 2.0};
double[][] sigma3 = {{1.0, 0.8}, {0.8, 1.0}};
double[] mu4 = {3.0, 5.0};
double[][] sigma4 = {{1.0, 0.5}, {0.5, 1.0}};
double[][] data = new double[3000][];
MultivariateGaussianDistribution g1 = new MultivariateGaussianDistribution(mu1, sigma1);
double[][] data1 = new double[500][];
for (int i = 0; i < data1.length; i++) {
data[i] = g1.rand();
data1[i] = data[i];
}
MultivariateGaussianDistribution g2 = new MultivariateGaussianDistribution(mu2, sigma2);
double[][] data2 = new double[1000][];
for (int i = 0; i < data2.length; i++) {
data[500+i] = g2.rand();
data2[i] = data[500+i];
}
MultivariateGaussianDistribution g3 = new MultivariateGaussianDistribution(mu3, sigma3);
double[][] data3 = new double[1000][];
for (int i = 0; i < data3.length; i++) {
data[1500+i] = g3.rand();
data3[i] = data[1500+i];
}
MultivariateGaussianDistribution g4 = new MultivariateGaussianDistribution(mu4, sigma4);
double[][] data4 = new double[500][];
for (int i = 0; i < data4.length; i++) {
data[2500+i] = g4.rand();
data4[i] = data[2500+i];
}
MultivariateGaussianMixture mixture = new MultivariateGaussianMixture(data, 4);
int n = 40;
int m = 40;
double[][][] z = new double[m][n][3];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
z[i][j][0] = 10.0 * (i - 12) / m;
z[i][j][1] = 10.0 * (j - 12) / n;
double[] point = {z[i][j][0], z[i][j][1]};
z[i][j][2] = mixture.p(point);
}
}
PlotCanvas canvas = Surface.plot(z);
canvas.setTitle("Gaussian Mixture");
add(canvas);
}
@Override
public String toString() {
return "Multivariate Gaussian Mixture";
}
public static void main(String[] args) {
double[] mu1 = {1.0, 1.0, 1.0};
double[][] sigma1 = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};
double[] mu2 = {-2.0, -2.0, -2.0};
double[][] sigma2 = {{1.0, 0.3, 0.8}, {0.3, 1.0, 0.5}, {0.8, 0.5, 1.0}};
double[] mu3 = {4.0, 2.0, 3.0};
double[][] sigma3 = {{1.0, 0.8, 0.3}, {0.8, 1.0, 0.5}, {0.3, 0.5, 1.0}};
double[] mu4 = {3.0, 5.0, 1.0};
double[][] sigma4 = {{1.0, 0.5, 0.5}, {0.5, 1.0, 0.5}, {0.5, 0.5, 1.0}};
double[][] data = new double[3000][];
MultivariateGaussianDistribution g1 = new MultivariateGaussianDistribution(mu1, sigma1);
double[][] data1 = new double[500][];
for (int i = 0; i < data1.length; i++) {
data[i] = g1.rand();
data1[i] = data[i];
}
MultivariateGaussianDistribution g2 = new MultivariateGaussianDistribution(mu2, sigma2);
double[][] data2 = new double[1000][];
for (int i = 0; i < data2.length; i++) {
data[500+i] = g2.rand();
data2[i] = data[500+i];
}
MultivariateGaussianDistribution g3 = new MultivariateGaussianDistribution(mu3, sigma3);
double[][] data3 = new double[1000][];
for (int i = 0; i < data3.length; i++) {
data[1500+i] = g3.rand();
data3[i] = data[1500+i];
}
MultivariateGaussianDistribution g4 = new MultivariateGaussianDistribution(mu4, sigma4);
double[][] data4 = new double[500][];
for (int i = 0; i < data4.length; i++) {
data[2500+i] = g4.rand();
data4[i] = data[2500+i];
}
System.out.println(new MultivariateGaussianDistribution(data1));
System.out.println(new MultivariateGaussianDistribution(data2));
System.out.println(new MultivariateGaussianDistribution(data3));
System.out.println(new MultivariateGaussianDistribution(data4));
MultivariateGaussianMixture mixture = new MultivariateGaussianMixture(data, 4);
System.out.println(mixture);
mixture = new MultivariateGaussianMixture(data, 6);
System.out.println(mixture);
mixture = new MultivariateGaussianMixture(data);
System.out.println(mixture);
double[] mu100 = new double[20];
double[] sigma100 = new double[20];
for (int i = 0; i < sigma100.length; i++)
sigma100[i] = 1;
MultivariateGaussianDistribution g100 = new MultivariateGaussianDistribution(mu100, sigma100);
double[] data100 = new double[500000];
for (int i = 0; i < data100.length; i++) {
double[] x = g100.rand();
data100[i] = Math.norm(x);
}
System.out.println(Math.mean(data100));
System.out.println(Math.sd(data100));
JFrame frame = new JFrame("Norm of Samples of Gaussian Mixture of Dimension 100");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(Histogram.plot(data100, 100));
frame.setVisible(true);
}
}
Ads help maintain this website.