|
|
|
@ -36,15 +36,19 @@ namespace MathNet.Numerics.UnitTests.DistributionTests |
|
|
|
using MathNet.Numerics.Statistics; |
|
|
|
using MathNet.Numerics.Distributions; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// This class will perform various tests on discrete and continuous univariate distributions. The multivariate distributions
|
|
|
|
/// will implement these respective tests in their local unit test classes as they do not adhere to the same interfaces.
|
|
|
|
/// </summary>
|
|
|
|
[TestFixture] |
|
|
|
public class CommonDistributionTests |
|
|
|
{ |
|
|
|
// The number of samples we want.
|
|
|
|
private int numberOfTestSamples = 100000; |
|
|
|
public static int NumberOfTestSamples = 10000000; |
|
|
|
// The accuracy of the histograms.
|
|
|
|
private double sampleAccuracy = 0.01; |
|
|
|
public static double SampleAccuracy = 0.01; |
|
|
|
// The number of buckets to use to test against the cdf.
|
|
|
|
private int numberOfBuckets = 100; |
|
|
|
public static int NumberOfBuckets = 100; |
|
|
|
// The list of discrete distributions which we test.
|
|
|
|
private List<IDiscreteDistribution> discreteDistributions; |
|
|
|
// The list of continuous distributions which we test.
|
|
|
|
@ -66,7 +70,7 @@ namespace MathNet.Numerics.UnitTests.DistributionTests |
|
|
|
continuousDistributions.Add(new Normal(0.0, 1.0)); |
|
|
|
continuousDistributions.Add(new Weibull(1.0, 1.0)); |
|
|
|
continuousDistributions.Add(new LogNormal(1.0, 1.0)); |
|
|
|
//continuousDistributions.Add(new StudentT(0.0, 1.0, 3.0));
|
|
|
|
continuousDistributions.Add(new StudentT(0.0, 1.0, 5.0)); |
|
|
|
} |
|
|
|
|
|
|
|
[Test] |
|
|
|
@ -114,11 +118,14 @@ namespace MathNet.Numerics.UnitTests.DistributionTests |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Test the method which samples only one variable at a time.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
[MultipleAsserts] |
|
|
|
public void SampleFollowsCorrectDistribution() |
|
|
|
{ |
|
|
|
Random rnd = new MersenneTwister(); |
|
|
|
Random rnd = new MersenneTwister(1); |
|
|
|
|
|
|
|
// The test samples from the distributions, builds a histogram and checks
|
|
|
|
// whether the histogram follows the CDF.
|
|
|
|
@ -126,81 +133,75 @@ namespace MathNet.Numerics.UnitTests.DistributionTests |
|
|
|
{ |
|
|
|
dd.RandomSource = rnd; |
|
|
|
|
|
|
|
double[] samples = new double[numberOfTestSamples]; |
|
|
|
for (int i = 0; i < numberOfTestSamples; i++) |
|
|
|
double[] samples = new double[NumberOfTestSamples]; |
|
|
|
for (int i = 0; i < NumberOfTestSamples; i++) |
|
|
|
{ |
|
|
|
samples[i] = (double) dd.Sample(); |
|
|
|
} |
|
|
|
|
|
|
|
var histogram = new Histogram(samples, numberOfBuckets); |
|
|
|
for (int i = 0; i < numberOfBuckets; i++) |
|
|
|
{ |
|
|
|
var bucket = histogram[i]; |
|
|
|
double empiricalProbability = bucket.Count / (double)numberOfTestSamples; |
|
|
|
double realProbability = dd.CumulativeDistribution(bucket.UpperBound) |
|
|
|
- dd.CumulativeDistribution(bucket.LowerBound); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), sampleAccuracy, dd.ToString()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var cd in continuousDistributions) |
|
|
|
{ |
|
|
|
cd.RandomSource = rnd; |
|
|
|
double[] samples = new double[numberOfTestSamples]; |
|
|
|
for (int i = 0; i < numberOfTestSamples; i++) |
|
|
|
double[] samples = new double[NumberOfTestSamples]; |
|
|
|
for (int i = 0; i < NumberOfTestSamples; i++) |
|
|
|
{ |
|
|
|
samples[i] = cd.Sample(); |
|
|
|
} |
|
|
|
|
|
|
|
var histogram = new Histogram(samples, numberOfBuckets); |
|
|
|
for (int i = 0; i < numberOfBuckets; i++) |
|
|
|
var histogram = new Histogram(samples, NumberOfBuckets); |
|
|
|
for (int i = 0; i < NumberOfBuckets; i++) |
|
|
|
{ |
|
|
|
var bucket = histogram[i]; |
|
|
|
double empiricalProbability = bucket.Count / (double)numberOfTestSamples; |
|
|
|
double empiricalProbability = bucket.Count / (double)NumberOfTestSamples; |
|
|
|
double realProbability = cd.CumulativeDistribution(bucket.UpperBound) |
|
|
|
- cd.CumulativeDistribution(bucket.LowerBound); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), sampleAccuracy, cd.ToString()); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), SampleAccuracy, cd.ToString()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Test the method which samples a sequence of variables.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
[MultipleAsserts] |
|
|
|
public void SamplesFollowsCorrectDistribution() |
|
|
|
{ |
|
|
|
Random rnd = new MersenneTwister(); |
|
|
|
Random rnd = new MersenneTwister(1); |
|
|
|
|
|
|
|
// The test samples from the distributions, builds a histogram and checks
|
|
|
|
// whether the histogram follows the CDF.
|
|
|
|
foreach (var dd in discreteDistributions) |
|
|
|
{ |
|
|
|
dd.RandomSource = rnd; |
|
|
|
var samples = dd.Samples().Take(numberOfTestSamples).Select(x => (double)x); |
|
|
|
var samples = dd.Samples().Take(NumberOfTestSamples).Select(x => (double)x); |
|
|
|
|
|
|
|
var histogram = new Histogram(samples, numberOfBuckets); |
|
|
|
for (int i = 0; i < numberOfBuckets; i++) |
|
|
|
var histogram = new Histogram(samples, NumberOfBuckets); |
|
|
|
for (int i = 0; i < NumberOfBuckets; i++) |
|
|
|
{ |
|
|
|
var bucket = histogram[i]; |
|
|
|
double empiricalProbability = bucket.Count / (double)numberOfTestSamples; |
|
|
|
double empiricalProbability = bucket.Count / (double)NumberOfTestSamples; |
|
|
|
double realProbability = dd.CumulativeDistribution(bucket.UpperBound) |
|
|
|
- dd.CumulativeDistribution(bucket.LowerBound); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), sampleAccuracy, dd.ToString()); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), SampleAccuracy, dd.ToString()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var cd in continuousDistributions) |
|
|
|
{ |
|
|
|
cd.RandomSource = rnd; |
|
|
|
var samples = cd.Samples().Take(numberOfTestSamples); |
|
|
|
var samples = cd.Samples().Take(NumberOfTestSamples); |
|
|
|
|
|
|
|
var histogram = new Histogram(samples, numberOfBuckets); |
|
|
|
for (int i = 0; i < numberOfBuckets; i++) |
|
|
|
var histogram = new Histogram(samples, NumberOfBuckets); |
|
|
|
for (int i = 0; i < NumberOfBuckets; i++) |
|
|
|
{ |
|
|
|
var bucket = histogram[i]; |
|
|
|
double empiricalProbability = bucket.Count / (double)numberOfTestSamples; |
|
|
|
double empiricalProbability = bucket.Count / (double)NumberOfTestSamples; |
|
|
|
double realProbability = cd.CumulativeDistribution(bucket.UpperBound) |
|
|
|
- cd.CumulativeDistribution(bucket.LowerBound); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), sampleAccuracy, cd.ToString()); |
|
|
|
Assert.LessThan(Math.Abs(empiricalProbability - realProbability), SampleAccuracy, cd.ToString()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|