<?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.
  -->

<?xml-stylesheet type="text/xsl" href="./xdoc.xsl"?>
<document url="distribution.html">
  <properties>
    <title>The Commons Math User Guide - Distributions</title>
  </properties>
  <body>
    <section name="8 Probability Distributions">
      <subsection name="8.1 Overview" href="overview">
        <p>
          Standard distributions are now available in the
          <a href="https://commons.apache.org/proper/commons-statistics/userguide/index.html">
          Commons Statistics</a> component.
        </p>
        <p>
          Commons Math provides
          <ul>
            <li>
              an <a href="../apidocs/org/apache/commons/math4/legacy/distribution/EnumeratedDistribution.html">
              EnumeratedDistribution</a> class that represents discrete distributions of a finite,
              enumerated set of values.
            </li>
            <li>
              a <a href="../apidocs/org/apache/commons/math4/legacy/distribution/MultiVariateNormalDistribution.html">
              MultivariateNormalDistribution</a> interface that represents multivariate Gaussian
              distributions.
            </li>
          </ul>
        </p>
        <p>
          Inverse distribution functions can be computed using the
          <code>inverseCumulativeProbability</code> methods.  For continuous <code>f</code>
          and <code>p</code> a probability, <code>f.inverseCumulativeProbability(p)</code> returns
          <code><ul>
            <li>inf{x in R | P(X&le;x) &ge; p} for 0 &lt; p &lt; 1,</li>
            <li>inf{x in R | P(X&le;x) &gt; 0} for p = 0.</li>
          </ul></code> where <code>X</code> is distributed as <code>f</code>.<br/>
          For discrete <code>f</code>, the definition is the same, with <code>Z</code> (the integers)
          in place of <code>R</code>.  Note that in the discrete case, the &ge; in the definition
          can make a difference when <code>p</code> is an attained value of the distribution.
        </p>
      </subsection>

      <subsection name="8.2 Generating data like an input file"
                  href="empirical">
        <p>
          Using the <code>EmpiricalDistribution</code> class, you can generate data based on
          the values in an input file:

          <source>
int binCount = 500;
EmpiricalDistribution empDist = new EmpiricalDistribution(binCount);
empDist.load("data.txt");
RealDistribution.Sampler sampler = empDist.createSampler(RandomSource.MT.create());
double value = sampler.nextDouble(); </source>

          The entire input file is read and a probability density function is estimated
          based on data from the file.
          The estimation method is essentially the
          <a href="http://nedwww.ipac.caltech.edu/level5/March02/Silverman/Silver2_6.html">
            Variable Kernel Method</a> with Gaussian smoothing.
          The created sampler will return random values whose probability distribution
          matches the empirical distribution (i.e. if you generate a large number of
          such values, their distribution should "look like" the distribution of the
          values in the input file.
          The values are not stored in memory in this case either, so there is no limit to the
          size of the input file.
        </p>
      </subsection>
    </section>
  </body>
</document>
