Add separate example project for some code used to generate figures for the userguide.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1538287 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6191949f89
commit
5ecdf2312d
|
@ -0,0 +1,309 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You 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 org.apache.commons.math3.userguide;
|
||||
|
||||
import java.awt.BasicStroke;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Font;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
|
||||
import org.apache.commons.math3.distribution.BetaDistribution;
|
||||
import org.apache.commons.math3.distribution.CauchyDistribution;
|
||||
import org.apache.commons.math3.distribution.ChiSquaredDistribution;
|
||||
import org.apache.commons.math3.distribution.ExponentialDistribution;
|
||||
import org.apache.commons.math3.distribution.FDistribution;
|
||||
import org.apache.commons.math3.distribution.GammaDistribution;
|
||||
import org.apache.commons.math3.distribution.LevyDistribution;
|
||||
import org.apache.commons.math3.distribution.LogNormalDistribution;
|
||||
import org.apache.commons.math3.distribution.NormalDistribution;
|
||||
import org.apache.commons.math3.distribution.ParetoDistribution;
|
||||
import org.apache.commons.math3.distribution.RealDistribution;
|
||||
import org.apache.commons.math3.distribution.TDistribution;
|
||||
import org.apache.commons.math3.distribution.WeibullDistribution;
|
||||
import org.apache.commons.math3.random.MersenneTwister;
|
||||
import org.apache.commons.math3.random.RandomGenerator;
|
||||
import org.apache.commons.math3.userguide.ExampleUtils.ExampleFrame;
|
||||
import org.apache.commons.math3.util.FastMath;
|
||||
|
||||
import com.xeiam.xchart.Chart;
|
||||
import com.xeiam.xchart.ChartBuilder;
|
||||
import com.xeiam.xchart.Series;
|
||||
import com.xeiam.xchart.SeriesMarker;
|
||||
import com.xeiam.xchart.StyleManager.ChartType;
|
||||
import com.xeiam.xchart.StyleManager.LegendPosition;
|
||||
import com.xeiam.xchart.XChartPanel;
|
||||
|
||||
/**
|
||||
* Plots 2D samples drawn from various pseudo / quasi-random generators.
|
||||
*/
|
||||
public class RealDistributionComparison {
|
||||
|
||||
public static void addPDFSeries(Chart chart, RealDistribution distribution, String desc, int lowerBound, int upperBound) {
|
||||
// generates Log data
|
||||
List<Number> xData = new ArrayList<Number>();
|
||||
List<Number> yData = new ArrayList<Number>();
|
||||
int samples = 100;
|
||||
double stepSize = (upperBound - lowerBound) / (double) samples;
|
||||
for (double x = lowerBound; x <= upperBound; x += stepSize) {
|
||||
try {
|
||||
double density = distribution.density(x);
|
||||
if (! Double.isInfinite(density) && ! Double.isNaN(density)) {
|
||||
xData.add(x);
|
||||
yData.add(density);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
// some distributions may reject certain values depending on the parameter settings
|
||||
}
|
||||
}
|
||||
|
||||
Series series = chart.addSeries(desc, xData, yData);
|
||||
series.setMarker(SeriesMarker.NONE);
|
||||
series.setLineStyle(new BasicStroke(1.2f));
|
||||
}
|
||||
|
||||
public static void addCDFSeries(Chart chart, RealDistribution distribution, String desc, int lowerBound, int upperBound) {
|
||||
// generates Log data
|
||||
List<Number> xData = new ArrayList<Number>();
|
||||
List<Number> yData = new ArrayList<Number>();
|
||||
int samples = 100;
|
||||
double stepSize = (upperBound - lowerBound) / (double) samples;
|
||||
for (double x = lowerBound; x <= upperBound; x += stepSize) {
|
||||
double density = distribution.cumulativeProbability(x);
|
||||
if (! Double.isInfinite(density) && ! Double.isNaN(density)) {
|
||||
xData.add(x);
|
||||
yData.add(density);
|
||||
}
|
||||
}
|
||||
|
||||
Series series = chart.addSeries(desc, xData, yData);
|
||||
series.setMarker(SeriesMarker.NONE);
|
||||
series.setLineStyle(new BasicStroke(1.2f));
|
||||
}
|
||||
|
||||
public static Chart createChart(String title, int minX, int maxX, LegendPosition position) {
|
||||
Chart chart = new ChartBuilder().width(235).height(200).build();
|
||||
|
||||
// Customize Chart
|
||||
chart.setChartTitle(title);
|
||||
chart.getStyleManager().setChartTitleVisible(true);
|
||||
chart.getStyleManager().setChartTitleFont(new Font("Arial", Font.PLAIN, 10));
|
||||
chart.getStyleManager().setLegendPosition(position);
|
||||
chart.getStyleManager().setLegendVisible(true);
|
||||
chart.getStyleManager().setLegendFont(new Font("Arial", Font.PLAIN, 10));
|
||||
chart.getStyleManager().setLegendPadding(6);
|
||||
//chart.getStyleManager().setLegendSeriesLineLength(6);
|
||||
chart.getStyleManager().setAxisTickLabelsFont(new Font("Arial", Font.PLAIN, 9));
|
||||
|
||||
chart.getStyleManager().setXAxisMin(minX);
|
||||
chart.getStyleManager().setXAxisMax(maxX);
|
||||
chart.getStyleManager().setChartBackgroundColor(Color.white);
|
||||
chart.getStyleManager().setChartPadding(4);
|
||||
|
||||
chart.getStyleManager().setChartType(ChartType.Line);
|
||||
return chart;
|
||||
}
|
||||
|
||||
public static JComponent createComponent(String distributionName, int minX, int maxX, String[] seriesText, RealDistribution... series) {
|
||||
JComponent container = new JPanel();
|
||||
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
|
||||
|
||||
container.add(new JLabel(distributionName));
|
||||
|
||||
Chart chart = createChart("PDF", minX, maxX, LegendPosition.InsideNE);
|
||||
int i = 0;
|
||||
for (RealDistribution d : series) {
|
||||
addPDFSeries(chart, d, seriesText[i++], minX, maxX);
|
||||
}
|
||||
container.add(new XChartPanel(chart));
|
||||
|
||||
chart = createChart("CDF", minX, maxX, LegendPosition.InsideSE);
|
||||
i = 0;
|
||||
for (RealDistribution d : series) {
|
||||
addCDFSeries(chart, d, seriesText[i++], minX, maxX);
|
||||
}
|
||||
container.add(new XChartPanel(chart));
|
||||
|
||||
container.setBorder(BorderFactory.createLineBorder(Color.black, 1));
|
||||
return container;
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public static class Display extends ExampleFrame {
|
||||
|
||||
private JComponent container;
|
||||
|
||||
public Display() {
|
||||
setTitle("Commons-Math: Real distributions overview");
|
||||
setSize(1320, 920);
|
||||
|
||||
container = new JPanel();
|
||||
container.setLayout(new GridBagLayout());
|
||||
|
||||
GridBagConstraints c = new GridBagConstraints();
|
||||
c.fill = GridBagConstraints.VERTICAL;
|
||||
c.gridx = 0;
|
||||
c.gridy = 0;
|
||||
c.insets = new Insets(2, 2, 2, 2);
|
||||
|
||||
JComponent comp = null;
|
||||
|
||||
comp = createComponent("Normal", -5, 5,
|
||||
new String[] { "μ=0,σ\u00B2=0.2", "μ=0,σ\u00B2=1", "μ=0,σ\u00B2=5", "μ=-2,σ\u00B2=0.5" },
|
||||
new NormalDistribution(0, FastMath.sqrt(0.2)),
|
||||
new NormalDistribution(),
|
||||
new NormalDistribution(0, FastMath.sqrt(5)),
|
||||
new NormalDistribution(-2, FastMath.sqrt(0.5)));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Beta", 0, 1,
|
||||
new String[] { "α=β=0.5", "α=5,β=1", "α=1,β=3", "α=2,β=2", "α=2,β=5" },
|
||||
new BetaDistribution(0.5, 0.5),
|
||||
new BetaDistribution(5, 1),
|
||||
new BetaDistribution(1, 3),
|
||||
new BetaDistribution(2, 2),
|
||||
new BetaDistribution(2, 5));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Cauchy", -5, 5,
|
||||
new String[] { "x=0,γ=0.5", "x=0,γ=1", "x=0,γ=2", "x=-2,γ=1" },
|
||||
new CauchyDistribution(0, 0.5),
|
||||
new CauchyDistribution(0, 1),
|
||||
new CauchyDistribution(0, 2),
|
||||
new CauchyDistribution(-2, 1));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("ChiSquared", 0, 5,
|
||||
new String[] { "k=1", "k=2", "k=3", "k=4", "k=6" },
|
||||
new ChiSquaredDistribution(1),
|
||||
new ChiSquaredDistribution(2),
|
||||
new ChiSquaredDistribution(3),
|
||||
new ChiSquaredDistribution(4),
|
||||
new ChiSquaredDistribution(6));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 0;
|
||||
comp = createComponent("Exponential", 0, 5,
|
||||
new String[] { "λ=0.5", "λ=1", "λ=1.5", "λ=2.5" },
|
||||
new ExponentialDistribution(0.5),
|
||||
new ExponentialDistribution(1),
|
||||
new ExponentialDistribution(1.5),
|
||||
new ExponentialDistribution(2.5));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Fisher-Snedecor", 0, 5,
|
||||
new String[] { "d1=1,d2=1", "d1=2,d2=1", "d1=5,d2=2", "d1=100,d2=1", "d1=100,d2=100" },
|
||||
new FDistribution(1, 1),
|
||||
new FDistribution(2, 1),
|
||||
new FDistribution(5, 2),
|
||||
new FDistribution(100, 1),
|
||||
new FDistribution(100, 100));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Gamma", 0, 20,
|
||||
new String[] { "k=1,θ=2", "k=2,θ=2", "k=3,θ=2", "k=5,θ=1", "k=9,θ=0.5" },
|
||||
new GammaDistribution(1, 2),
|
||||
new GammaDistribution(2, 2),
|
||||
new GammaDistribution(3, 2),
|
||||
new GammaDistribution(5, 1),
|
||||
new GammaDistribution(9, 0.5));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
RandomGenerator rng = new MersenneTwister(0);
|
||||
comp = createComponent("Levy", 0, 3,
|
||||
new String[] { "c=0.5", "c=1", "c=2", "c=4", "c=8" },
|
||||
new LevyDistribution(rng, 0, 0.5),
|
||||
new LevyDistribution(rng, 0, 1),
|
||||
new LevyDistribution(rng, 0, 2),
|
||||
new LevyDistribution(rng, 0, 4),
|
||||
new LevyDistribution(rng, 0, 8));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 0;
|
||||
comp = createComponent("Log-Normal", 0, 3,
|
||||
new String[] { "μ=0,σ\u00B2=10", "μ=0,σ\u00B2=1.5", "μ=0,σ\u00B2=1", "μ=0,σ\u00B2=0.5", "μ=0,σ\u00B2=0.25", "μ=0,σ\u00B2=0.125" },
|
||||
new LogNormalDistribution(0, 10),
|
||||
new LogNormalDistribution(0, 1.5),
|
||||
new LogNormalDistribution(0, 1),
|
||||
new LogNormalDistribution(0, 0.5),
|
||||
new LogNormalDistribution(0, 0.25),
|
||||
new LogNormalDistribution(0, 0.125));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Pareto", 0, 5,
|
||||
new String[] { "x=1,α=1", "x=1,α=2", "x=1,α=3", "x=1,α=10" },
|
||||
new ParetoDistribution(1, 1),
|
||||
new ParetoDistribution(1, 2),
|
||||
new ParetoDistribution(1, 3),
|
||||
new ParetoDistribution(1, 10));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Student-T", -5, 5,
|
||||
new String[] { "df=1", "df=2", "df=5", "df=10000" },
|
||||
new TDistribution(1),
|
||||
new TDistribution(2),
|
||||
new TDistribution(5),
|
||||
new TDistribution(10000));
|
||||
container.add(comp, c);
|
||||
|
||||
c.gridx++;
|
||||
comp = createComponent("Weibull", 0, 3,
|
||||
new String[] { "λ=0.5,k=1", "λ=1,k=1", "λ=1.5,k=1", "λ=5,k=1" },
|
||||
new WeibullDistribution(0.5, 1),
|
||||
new WeibullDistribution(1, 1),
|
||||
new WeibullDistribution(1.5, 1),
|
||||
new WeibullDistribution(5, 1));
|
||||
container.add(comp, c);
|
||||
|
||||
JScrollPane scrollPane = new JScrollPane(container);
|
||||
add(scrollPane);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getMainPanel() {
|
||||
return container;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
ExampleUtils.showExampleFrame(new Display());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You 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.
|
||||
-->
|
||||
<!--
|
||||
Stripped down maven pom used for generating example code for the commons math userguide.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-math3-examples</artifactId>
|
||||
<version>3.3-SNAPSHOT</version>
|
||||
<name>Commons Math User Guide</name>
|
||||
<inceptionYear>2003</inceptionYear>
|
||||
<description>Examples</description>
|
||||
<url>http://commons.apache.org/math/</url>
|
||||
<issueManagement>
|
||||
<system>jira</system>
|
||||
<url>http://issues.apache.org/jira/browse/MATH</url>
|
||||
</issueManagement>
|
||||
<scm>
|
||||
<connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/math/trunk</connection>
|
||||
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/math/trunk</developerConnection>
|
||||
<url>http://svn.apache.org/viewvc/commons/proper/math/trunk</url>
|
||||
</scm>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<sourceDirectory>java</sourceDirectory>
|
||||
</build>
|
||||
<reporting>
|
||||
</reporting>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-math3</artifactId>
|
||||
<version>3.3-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.xeiam.xchart</groupId>
|
||||
<artifactId>xchart</artifactId>
|
||||
<version>2.2.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
Loading…
Reference in New Issue