Continuous Distributions in C# QuickStart Sample
Illustrates how to use the classes that represent continuous probability distributions in the Numerics.NET.Statistics.Distributions namespace in C#.
View this sample in: Visual Basic F# IronPython
using System;
using Numerics.NET.Random;
using Numerics.NET.Statistics;
using Numerics.NET.Statistics.Distributions;
namespace Numerics.NET.Quickstart.CSharp
{
/// <summary>
/// Demonstrates how to use classes that implement
/// continuous probabililty distributions.
/// </summary>
class ContinuousDistributions
{
static void Main(string[] args)
{
// The license is verified at runtime. We're using
// a 30 day trial key here. For more information, see
// https://numerics.net/trial-key
Numerics.NET.License.Verify("64542-18980-57619-62268");
// This QuickStart Sample demonstrates the capabilities of
// the classes that implement continuous probability distributions.
// These classes inherit from the ContinuousDistribution class.
//
// For an illustration of classes that implement discrete probability
// distributions, see the DiscreteDistributions QuickStart Sample.
//
// We illustrate the properties and methods of continuous distribution
// using a Weibull distribution. The same properties and methods
// apply to all other continuous distributions.
//
// Constructing distributions
//
// Most distributions have one or more parameters with different definitions.
//
// The location parameter is always related to the mean of the distribution.
// When omitted, its default value is zero.
//
// The scale parameter is always directly related to the standard deviation.
// A larger scale parameter means that the distribution is wider.
// When omitted, its default value is one.
// The Weibull distribution has three constructors. The most complete
// constructor takes a location, scale, and shape parameter.
WeibullDistribution weibull = new WeibullDistribution(3, 2, 3);
//
// Basic statistics
//
// The Mean property returns the mean of the distribution:
Console.WriteLine($"Mean: {weibull.Mean:F5}");
// The Variance and StandardDeviation are also available:
Console.WriteLine($"Variance: {weibull.Variance:F5}");
Console.WriteLine($"Standard deviation: {weibull.StandardDeviation:F5}");
// The inter-quartile range is another measure of scale:
Console.WriteLine($"Inter-quartile range: {weibull.InterQuartileRange:F5}");
// As are the skewness:
Console.WriteLine($"Skewness: {weibull.Skewness:F5}");
// The Kurtosis property returns the kurtosis supplement.
// The Kurtosis property for the normal distribution returns zero.
Console.WriteLine($"Kurtosis: {weibull.Kurtosis:F5}");
Console.WriteLine();
//
// Distribution functions
//
// The (cumulative) distribution function (CDF) is implemented by the
// DistributionFunction method:
Console.WriteLine($"CDF(4.5) = {weibull.DistributionFunction(4.5):F5}");
// Its complement is the survivor function:
Console.WriteLine($"SDF(4.5) = {weibull.SurvivorDistributionFunction(4.5):F5}");
// While its inverse is given by the InverseDistributionFunction method:
Console.WriteLine($"Inverse CDF(0.4) = {weibull.InverseDistributionFunction(0.4):F5}");
// The probability density function (PDF) is also available:
Console.WriteLine($"PDF(4.5) = {weibull.ProbabilityDensityFunction(4.5):F5}");
// The Probability method returns the probability that a variate lies between two values:
Console.WriteLine("Probability(4.5, 5.5) = {0:F5}", weibull.Probability(4.5, 5.5));
Console.WriteLine();
//
// Random variates
//
// The Sample method returns a single random variate
// using the specified random number generator:
System.Random rng = new MersenneTwister();
double x = weibull.Sample(rng);
// The SampleInto method fills an array or vector with
// random variates. It has several overloads:
double[] xArray = new double[100];
// 1. Fill all values:
weibull.SampleInto(rng, xArray);
// 2. Fill only a range (start index and length are supplied)
weibull.SampleInto(rng, xArray, 20, 50);
// The same two options are available with a DenseVector
// instead of a double array.
// The GetExpectedHistogram method returns a Histogram that contains the
// expected number of samples in each bin, given the total number of samples.
// The bins are specified by lower and upper bounds and number of bins:
var h = weibull.GetExpectedHistogram(3.0, 10.0, 5, 100);
Console.WriteLine("Expected distribution of 100 samples:");
Console.WriteLine(h.ToString());
Console.WriteLine();
// or by supplying an array of boundaries:
h = weibull.GetExpectedHistogram(new double[] {3.0, 5.2, 7.4, 9.6, 11.8}, 100);
Console.WriteLine("Expected distribution of 100 samples:");
Console.WriteLine(h.ToString());
Console.Write("Press any key to exit.");
Console.ReadLine();
}
}
}